Swift tableView のページ処理
質問
私はjsonの解析コードで成功した作業テーブルビューを持っている。しかし、1000以上のアイテムを持っているかもしれないので、下側をスクロールするときにページネーションが必要です。私はどのように私は以下の私のコードをこれを行うことができますわからない。客観的なCのために多くの例を持っていますが、Swiftのために私は作業例を見つけられませんでした。私はあなたの助けを待っています。私はあまりにも多くの人々の助けになると思います。ありがとうございます!
import UIKit
class ViewController: UIViewController, UITableViewDataSource,UITableViewDelegate {
let kSuccessTitle = "Congratulations"
let kErrorTitle = "Connection error"
let kNoticeTitle = "Notice"
let kWarningTitle = "Warning"
let kInfoTitle = "Info"
let kSubtitle = "You've just displayed this awesome Pop Up View"
@IBOutlet weak var myTableView: UITableView!
@IBOutlet weak var myActivityIndicator: UIActivityIndicatorView!
var privateList = [String]()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
loadItems()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
internal func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
return privateList.count
}
internal func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
let cell:myCell = tableView.dequeueReusableCellWithIdentifier("myCell") as! myCell
cell.titleLabel.text = privateList[indexPath.row]
return cell
}
func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
if (editingStyle == UITableViewCellEditingStyle.Delete){
print(indexPath.row)
let alert = SCLAlertView()
alert.addButton("Hayır"){ }
alert.addButton("Evet") {
self.myTableView.beginUpdates()
self.privateList.removeAtIndex(indexPath.row)
tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Left)
print("Silindi")
self.myTableView.endUpdates()
self.loadItems()
}
alert.showSuccess(kSuccessTitle, subTitle: kSubtitle)
}
}
func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
// the cells you would like the actions to appear needs to be editable
return true
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if(segue.identifier == "Detail") {
let destinationView = segue.destinationViewController as! DetailViewController
if let indexPath = myTableView.indexPathForCell(sender as! UITableViewCell) {
destinationView.privateLista = privateList[indexPath.row]
}
}
}
internal func tableView(tableView: UITableView, estimatedHeightForHeaderInSection section: Int) -> CGFloat
{
return 0.0
}
func loadItems()
{
loadItemsNow("privateList")
}
func loadItemsNow(listType:String){
myActivityIndicator.startAnimating()
let listUrlString = "http://bla.com/json2.php?listType=" + listType + "&t=" + NSUUID().UUIDString
let myUrl = NSURL(string: listUrlString);
let request = NSMutableURLRequest(URL:myUrl!);
request.HTTPMethod = "GET";
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
data, response, error in
if error != nil {
print(error!.localizedDescription)
dispatch_async(dispatch_get_main_queue(),{
self.myActivityIndicator.stopAnimating()
})
return
}
do {
let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as? NSArray
if let parseJSON = json {
self.privateList = parseJSON as! [String]
}
} catch {
print(error)
}
dispatch_async(dispatch_get_main_queue(),{
self.myActivityIndicator.stopAnimating()
self.myTableView.reloadData()
})
}
task.resume()
}
}
どのように解決するのですか?
サーバー側を変更する必要があります。
-
サーバーは
fromIndex
とbatchSize
の中にAPI
をクエリパラメータとして指定します。let listUrlString = "http://bla.com/json2.php?listType=" + listType + "&t=" + NSUUID().UUIDString + "&batchSize=" + batchSize + "&fromIndex=" + fromIndex
-
サーバーのレスポンスに、余分なキーである
totalItems
. これは、すべてのアイテムが受信されたかどうかを識別するために使用されます。配列やアイテムfromIndex
からbatchSize
の数を指定します。
アプリ側では
-
最初に
loadItem()
が呼び出されfromIndex = 0
とbatchSize = 20
(は、(例えばviewDidLoad()
またはviewWillAppear
からすべての項目を削除します。privateList
を呼び出す前にloadItem()
を初めて呼び出す前に -
サーバーは最初の20個のアイテムの配列を返し
totalItems
の合計数を返します。 -
の20項目を追加する。
privateList
配列に追加し、リロードしてtableView
-
で
tableView:cellForRowAtIndexPath
メソッドは、そのセルが最後のセルであるかどうかをチェックします。そしてtotalItems
(フォームサーバ) がprivateList.count
. これは、サーバーに読み込むべき項目がより多くあることを意味します。if indexPath.row == privateList.count - 1 { // last cell if totalItems > privateList.count { // more items to fetch loadItem() // increment `fromIndex` by 20 before server call } }
質問です。
where is refresh ? will be scrolling ?
サーバーからの応答を受信したら、新しい項目を配列に追加した後、リフレッシュします。(ステップ3)
スクロールすると
tableView:cellForRowAtIndexPath
をトリガーします。コードは、それが最後のセルであるかどうかをチェックし、残りのアイテムをフェッチします。(ステップ 4)
サンプルプロジェクトを追加しました。
https://github.com/rishi420/TableViewPaging
関連
-
libc++abi.dylib が NSException 型の捕捉できない例外で終了する理由 エラー
-
[解決済み] UITableViewの選択を無効にするにはどうすればよいですか?
-
[解決済み] 奇妙な不要なXcodeログを隠す
-
[解決済み] Objective-Cで文字列が空かどうかをテストするにはどうすればよいですか?
-
[解決済み] Objective-CでNSNotificationCenterを通してメッセージを送受信する?
-
[解決済み] UITextViewのサイズをコンテンツに合わせるには?
-
[解決済み] iOS - UITextFieldの外側をタッチするとキーボードが外れる。
-
[解決済み] iphoneアプリのベータテストはどのように行うのですか?
-
[解決済み] iOSとWatchKitで画像のtintColorを変更する方法
-
[解決済み] UIImageのサイズを変更する最も簡単な方法?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
libc++abi.dylib が NSException 型の捕捉できない例外で終了する理由 エラー
-
iOS classic error Undefined symbols for architecture XXX:
-
[解決済み] キーボードがあるときに、UITextFieldを編集開始時に上に移動させるには?
-
[解決済み] iOSのステータスバーの文字色を変更する方法
-
[解決済み] SwiftでStringを配列に分割する?
-
[解決済み] フレームワークを使用したiOSアプリがデバイス上でクラッシュ、dyld: ライブラリがロードされない、Xcode 6 Beta
-
[解決済み] iOS - UITextFieldの外側をタッチするとキーボードが外れる。
-
[解決済み] NSOperationとGrand Central Dispatchの比較
-
[解決済み] SwiftでURLから画像を読み込む/ダウンロードする
-
[解決済み] インポート vs #インポート - iOS 7