2016-04-12 10 views
0

私はヘッダにタイトルを追加したいと思います。これらのタイトルはviewDidLoadで開始された配列から取得されます。これにはoverride func titleForHeaderInSectionを使用しました。私のコードを実行すると、関数があまりにも早く呼び出されたように思えます。iOSのviewDidLoadの前に `titleForHeaderInSection`が呼び出されたようです

私は関数にブレークポイントを追加し、コードを3回ループした後、私はtableviewcontrollerを見ることができます。

また、2つの印刷コマンドを追加しました。 viewDidLoadに1つ、titleForHeaderInSectionに1つ。まず、titleForHeaderInSectionプリントが最初に印刷されます。

viewDidLoadの後にこの関数を呼び出すべきではありませんか?そして私の問題はどのように修正できますか?

これは次のようなコードが見えるものである:配列は[A、B、C、D]だけの簡単で、今最初のセクションのタイトルは「A」とのタイトルである

override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 
    print("title") 
    for index in tasks.indices{ 
      print(index) 
      if section == index{ 
       print(tasks[index]) 
       return tasks[index] 
      } 
      return "no name specified" 
     } 
    return "" 

} 

他の3 'が指定されていません名' ではない

私のviewDidLoadメソッドは次のようになります...

var taskName = [""] 
var dateStamp = [""] 
var userId = [""] 
var clType = [""] 
var tasks = [""] 
var count = 0 
var countarr = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] 
var result = false 
var dupClType = [""] 
var loaded = false 
override func viewDidLoad() { 
    super.viewDidLoad() 

    let query = PFQuery(className:"pendingTasks") 
    query.orderByAscending("clType") 
    query.findObjectsInBackgroundWithBlock({ (object: [PFObject]?, error: NSError?) in 
     if error != nil{ 

     print ("error") 
     } else { 
      if let objects = object{ 
       self.taskName.removeAll(keepCapacity: true) 
       self.dateStamp.removeAll(keepCapacity: true) 
       self.userId.removeAll(keepCapacity: true) 
       self.clType.removeAll(keepCapacity: true) 

       for object in objects{ 
        if object.objectId != "Q8knzhSDon"{ 
        self.taskName.append(object.objectForKey("taskName") as! String) 
        self.dateStamp.append(object.objectForKey("dateStamp") as! String) 
        self.userId.append(object.objectId! as String) 
        self.clType.append(object.objectForKey("clType") as! String) 

       } 

       } 


      } 


      self.tasks = Array(Set(self.clType)) 
      self.tasks.sortInPlace() 
      self.loaded = true 
      for items in self.tasks.indices{ 
       self.count=0 
      for item in self.clType{ 
       if item == self.tasks[items]{ 
        self.count = self.count + 1 
        self.countarr[items] = self.count 

       } 
      } 

     } 

       while self.countarr.last == 0{ 
       self.countarr.removeLast() 

       } 

     self.dupClType = self.clType 
     } 
     self.tableView.reloadData() 

    }) 

    // Uncomment the following line to preserve selection between presentations 
    // self.clearsSelectionOnViewWillAppear = false 

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller. 
    self.navigationItem.rightBarButtonItem = self.editButtonItem() 
} 
+0

VCのビューがdelegate/datasourceの設定などに追加される前にtableViewに何かしている場合、ビューの前にtableViewsのものが呼び出されます – SeanLintern88

+0

ありがとうございます。その前に私が何もしていないことを確認するにはどうすればいいですか?私の他のオーバーライド関数も 'viewDidLoad'の配列に基づいており、うまく動作します。 –

+0

viewDidLoadでtableview設定を行いますか?すべてのコードを見ることができません。 – SeanLintern88

答えて

0

これを試してみてください

override func viewWillAppear(animated: Bool) { 
    super. viewWillAppear (animated); 

    double delayInSeconds = 5.0; 
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW,delayInSeconds * NSEC_PER_SEC); 
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
      //code to be executed on the main queue after delay 
      self.tableView.reloadData() 
    }); 
} 
+0

私はこの部分を追加しましたが、それでも正しいことを表示していません。 –

+0

これは何かしましたが、デバッガでは私の配列は最初の3つまたは4つのループの間はまだ空です。 –

0

xibの代わりにUITableView'sdataSourcedelegateviewDidLoadに設定してみてください。それはうまくいくかもしれない、ちょうど推測。

+0

私は経験豊富なコーダーではないので、あなたが何を意味するのかよく分かりません。私は今編集で自分のコードを追加しました。 –

+0

問題ありません。このスクリーンショット(http://imgur.com/SUqrQ0K)を見て、ストーリーボードであなたのテーブルビューを選択してください。あなたは 'dataSource'と' delegate'を見ることができますか? – atulkhatri

+0

これはすべて設定が正しいため、問題ではありません。 –

0

明らかにXcodeを再起動すると(偶然クラッシュした)、私の問題を解決しました。 titleForHeaderInSectionを実行する前に、配列が正しくロードされるようになりました。

override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 
    var kopTekst = "" 
    for index in tasks.indices{ 
     if section == index{ 
     kopTekst = tasks[index] 
     } 
    } 
    return kopTekst 
} 

私もコードを変更しましたが、意図は同じである必要があります。

関連する問題