2016-07-31 55 views
2

我有一个名为TableViewController的视图控制器和另一个名为feed.swift的自定义单元格单元格被正确地重用,因为我不想知道什么按钮被按下。 在我cellForRowAtIndexPath我填充我的用户名与我分析过的JSON。它看起来像这样Swift:如何从一个UIViewController访问一个可变的字符串数组到一个TableView单元格文件

cell.username.text = username[indexPath.row]  
output-> ["andre gomes", "renato sanchez", "renato sanchez"] 

然后我已标记了用户名按钮,这样

cell.usernamePress.tag = indexPath.row 

在我feed.swift我检查,如果一个按钮这是怎么回事,我TableViewController按下并打印出分配给该按钮的标签

@IBAction func usernameBut(sender: AnyObject) { 
    print(usernamePress.tag) 
} 
output-> 2 

现在我需要访问feed.swift中的TableViewController的用户名数组,并做一些像用户名[usernamePress.tag]

我试图做一个global.swift文件,但我不能配置它的字符串数组。

import Foundation 

class Main { 
var name:String 
init(name:String) { 
    self.name = name 
    }  
} 
var mainInstance = Main(name: "hello") 

即使这样做后,我试着打印mainInstance.name,即使改变它也返回hello。我想要一个解决方案,其中字符串数组保存我在TableViewController中设置的值,并且我可以在feed.swift中使用它们。 欢迎任何建议!我很抱歉,如果有这方面的任何类似的问题,但我无法弄清楚如何使用它的字符串

回答

1

我建议你不要直接在你的FeedCell中使用数组,而是将新闻事件返回到你处理事件的TableViewController。根据Apple要求您使用的MVC方案(结账Apples documentation),您的所有数据操作都应在控制器中进行,然后使用该数据准备视图。这不是负责显示正确值的视图。

为了解决您的问题,我会选择通过委托模式传回新闻事件,例如,您创建一个FeedCellDelegate协议,定义一个函数时,按下该按钮被称为:

protocol FeedCellDelegate { 
    func feedCell(didPressButton button: UIButton, inCell cell: FeedCell) 
} 

里面你FeedCell你再添加一个委托属性,它被告知通过查看事件:

class FeedCell { 
    var delegate: FeedCellDelegate? 
    ... 
    @IBAction func pressedUsernameButton(sender: UIButton) { 
     delegate?.feedCell(didPressButton: sender, inCell: self) 
    } 
} 

如果您TableViewController则符合刚才定义的协议(实现在没有定义的方法),你指定的ViewController作为视图的代表,您可以处理逻辑控制器:

class TableViewController: UITableViewController, FeedCellDelegate { 
    ... 
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCellWithIdentifier("FeedCell", forIndexPath: indexPath) as! FeedCell 
     cell.delegate = self 
     // Further setup 
     return cell 
    } 

    func feedCell(didPressButton button: UIButton, inCell cell: FeedCell) { 
     guard let indexPath = tableView.indexPathForCell(cell) else { return } 

     // Do your event-handling 
     switch (button.tag) { 
     case 2: print("Is username button") 
     default: print("Press not handled") 
     } 
    } 
} 

正如你可能认识到我改变了你的班级名称。 A 饲料听起来更像模型级,而FeedCell暗示其显示数据的作用。如果你为自己的类和变量选择了自解释的名字,那么这会让程序员的生活方式变得更加简单,所以你可以自由地适应它。 :)

+0

在声明委托的时候用到了UsernameButton动作,我得到了1.在调用和2中使用了无关的参数标签didPressUsernameButtonInCell。代码看起来像这个委托?.feedCell(self),但是当我点击它时,它给了我它没有 –

+0

对不起,我没有编译代码,并在那里犯了两个错误。我更新了答案,它现在应该工作。 –

+1

谢谢你尼克指出我在协议和代表的方向。他们肯定是要走的路:) –

0

的可变数组,你应该弱阵列属性添加到tableViewCell:

弱var userNameArray:[String]?

然后在你的tableViewController的用户名数组传递进入细胞:

有趣的tableView(的tableView:UITableView的,的cellForRowAtIndexPath indexPath:NSIndexPath) - > {UITableViewCell的

//创建单元格,然后...

if let array = self.username { 
    cell.userNameArray = array 
} 

}

然后你可以使用在细胞本身的数组来填充其字段处理按钮水龙头,等c。

+0

你不能将weak应用于一个数组(字符串)。数组是一个结构权? –

相关问题