Ios 如何在加载自定义函数后初始化collectionView

Ios 如何在加载自定义函数后初始化collectionView,ios,swift,function,asynchronous,viewcontroller,Ios,Swift,Function,Asynchronous,Viewcontroller,我在class MoviesViewController:UIViewController、UICollectionViewDelegateFlowLayout、UICollectionViewDataSource、UIScrollViewDelegate{ 这个函数是自动初始化的,我不想自动启动。或者在它加载完一个加载外部数据的函数后启动 这是我的ViewController.swift的结构代码 class MyViewController: UIViewController, UIColl

我在
class MoviesViewController:UIViewController、UICollectionViewDelegateFlowLayout、UICollectionViewDataSource、UIScrollViewDelegate{

这个函数是自动初始化的,我不想自动启动。或者在它加载完一个加载外部数据的函数后启动

这是我的
ViewController.swift的结构代码

class MyViewController: UIViewController, UICollectionViewDelegateFlowLayout, UICollectionViewDataSource, UIScrollViewDelegate {
  @IBOutlet var scrollView : UIScrollView!
  @IBOutlet var collectionView1 : UICollectionView!
这是我希望在
CollectionView

func loaddata(){
  let url: NSURL = NSURL(string: "http://www.mywebsite/testdata.php")!
  let request:NSMutableURLRequest = NSMutableURLRequest(URL:url)
  let bodyData = "data=something"
  request.HTTPMethod = "POST"

  request.HTTPBody = bodyData.dataUsingEncoding(NSUTF8StringEncoding);
  NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) {
  (response, data, error) in
    let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding)!               
  }
}

override func viewDidLoad() {
  super.viewDidLoad()
  loaddata()
}

override func viewDidLayoutSubviews() {
  self.scrollView!.contentSize = CGSizeMake(1920, 2200)
}
在这里,func
CollectionView
init自动启动

//this is function that load automatically
func collectionView(collectionView: UICollectionView,
  layout collectionViewLayout: UICollectionViewLayout,
  insetForSectionAtIndex section: Int) -> UIEdgeInsets {
  return UIEdgeInsets(top: 0.0, left: 50.0, bottom: 0.0, right: 50.0)
}

// this is function load automatically
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
  if (collectionView == self.collectionView1) {
    let cell : FeaturedCollectionViewCell = collectionView.dequeueReusableCellWithReuseIdentifier(self.reuseIdentifierFeatured, forIndexPath: indexPath) as! FeaturedCollectionViewCell
    let  imageFilename = "featured-\(indexPath.row).jpg"
    cell.featuredImage.image = UIImage(named: imageFilename)
    return cell
  }
  return UICollectionViewCell()
}

如何保持
ViewController
loadData
之前启动?或者在您从
loadData
调用函数之前不启动
ViewController
当您还没有项目时,您不应该关心集合视图加载项目。可能发生的最坏情况是什么都不显示

但是,当数据加载完毕后,应调用
collectionView.reloadData
,以显示刚从服务器加载完毕的数据

如果您不希望在数据仍在加载时显示收集视图,只需在完成处理程序中设置
collectionView.hidden=true
,然后设置
collectionView.hidden=false
。您可能还应该显示一个活动指示器(例如
UIActivityIndicator
实例)通知用户仍在加载数据


此外,我还建议不要从
viewdiload
加载数据。您应该使用
viewdilease
当您还没有项目时,您不应该关心集合视图加载项目。可能发生的最坏情况是什么也不显示

但是,当数据加载完毕后,应调用
collectionView.reloadData
,以显示刚从服务器加载完毕的数据

如果您不希望在数据仍在加载时显示收集视图,只需在完成处理程序中设置
collectionView.hidden=true
,然后设置
collectionView.hidden=false
。您可能还应该显示一个活动指示器(例如
UIActivityIndicator
实例)通知用户仍在加载数据


另外,我建议不要从
viewDidLoad
加载数据。您应该使用
viewDidAppear

为什么在同一个视图中同时使用scrollview和collection视图?这是我从这里得到的结构。它工作正常,但我需要更改它。CollectionView位于scrollview中。这就是为什么会自动启动?您可以在
loadData()之后加载集合视图
函数完成获取网络数据。另一件事我没有找到
-collectionView:numberofitemsinssection:
的实现,它告诉集合视图将呈现多少项,当您没有数据时,它应该首先返回
0
。实现
-collectionView:numberofitemsinssection:
在您的数据中导入并从中返回
0
(当没有可用数据时)停止调用
cellForItemAtIndexPath
?为什么将scrollview和collection视图都放在同一个视图中?这是我从这里得到的一个结构。它工作正常,但我需要更改它。CollectionView位于scrollview中。这就是为什么会自动启动?您可以在
loadData()之后重新加载collection视图
函数完成获取网络数据。另一件事我没有找到
-collectionView:numberofitemsinssection:
的实现,它告诉集合视图将呈现多少项,当您没有数据时,它应该首先返回
0
。实现
-collectionView:numberofitemsinssection:
在您的数据中,从中导出并返回
0
(当没有可用数据时),停止调用
cellForItemAtIndexPath