如何在UICollectionViewLayout和UIViewController之间传递数据

时间:2015-10-23 10:00:56

标签: objective-c xcode swift uicollectionview uicollectionviewlayout

我需要根据对api的http调用创建自定义布局。根据api in loop的结果,我将从CollectionView

填充一个数组

在CustomLayout中我需要使用这个数组才能在每一行中正确绘制细节。 在collectionView中,我将数据添加到数组

后使用重新加载数据

感谢YOu

代码:

class epgViewController:  UIViewController,  UICollectionViewDelegate, UICollectionViewDataSource{

    var events     = [Event]()  
      @IBOutlet weak var collectionView: UICollectionView!

      //another initializations
      . . .

       //====== load Events ===============
        func get_events() {

            //http api call
            //as result in loop i append data to Events()
              self.events.append(newEvent)
        //reload collection view data    
        self.collectionView.reloadData()
       }
    }
//////////
/// LAyout
////////
     class customCollectionViewLayout: UICollectionViewLayout {

     //prepare layout  
     override func prepareLayout() {
        for section in 0...collectionView!.numberOfSections()-1 {
            how to access array from collectionView
            Events[i] ????

      }
     }  
    }

1 个答案:

答案 0 :(得分:0)

我不完全确定我理解你的情况,但我会在你的申请中提供两种沟通方式。

使用NSNotificationCenter

添加观察者在需要触发事件的控制器的viewDidLoad中:

NSNotificationCenter.defaultCenter().addObserver(self, selector: "remoteRefresh:", name:"remoteRefreshID", object: nil)

在同一个控制器中添加一个名称与我们的选择器相同的观察者,在上面的示例“remoteRefresh”中。

func remoteRefresh(notification: NSNotification) {
    // do stuff
}

然后在你的其他控制器中可以发布消息,你的remoteRefresh动作将会运行:

NSNotificationCenter.defaultCenter().postNotificationName("remoteRefreshID", object: nil)

有关详细信息,我在NSNotificationCenter上有two part tutorial

协议/代表模式

第二个是协议/代理模式,它涉及更多但我在这里有一个书面教程:

protocol / delegate pattern

另一个选项

如果您仍然遇到问题,可以选择此选项。您可以声明一个全局结构来保存您的数据,将其粘贴到操场上以便理解。

struct SessionData {

    static var events = [String]()
}


class classOne {

    func addValues() {

        SessionData.events.append("a message")
        SessionData.events.append("another message")
    }
}


class classTwo {

    func getValues() -> [String] {

        return SessionData.events

    }

}

classOne().addValues()
classTwo().getValues()