每个TableViewCell的IBAction都不返回唯一的NSIndexPath

时间:2016-02-14 17:40:42

标签: ios swift uitableview nsindexpath

当我点击用户名时,我正试图转到用户的个人资料屏幕(请参阅下面的屏幕截图)。我有一个UITableViewController,其Feed UITableViewCell每个都有一个usernameLabel(UILabel)和一个透明的userNameButton(UIButton)直接放在{{1}的顶部为了使UILabel可见。按钮本质上就像一个“命中区域”。我知道我应该删除UILabel并让UIButton的文本更新来说出用户名,但这是一个不同的故事。

这是我的IBAction(Segue代码还没有在这里):

usernameLabel

几个问题:

  1. 我的 @IBAction func usernameButtonPressed(sender: UIButton) { let indexPath = NSIndexPath(forRow: sender.tag, inSection: 0) let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! DrawingTableViewCell print("index path is: \(indexPath)") let cellsUsernameString = cell.usernameLabel.text print("just tapped the Feed username button for \(cellsUsernameString!)") } 位于我的UITableViewController中。我应该把这个IBAction放在UITableViewCell的类中吗?或者这里好吗?
  2. usernameButtonPressed I打印对于每个表格单元格完全相同。为什么是这样?我的indexPath不会更新为不同的int值吗?
  3. 我认为作为#2的结果,每个表格单元格都返回一个不正确的用户名字符串。
  4. 总的来说,我采取此操作的目标是从每个相应的tableview单元格中获取特定用户的用户(或对象)信息,以便我可以正确地转到该特定用户配置文件。显然我需要更多的代码才能做到这一点,但这是我尝试这一点的开始,此时我只是想为每个单元格获取正确的用户名。

    这是TableView的屏幕截图,试图提供更多上下文:

    enter image description here

2 个答案:

答案 0 :(得分:1)

  1. 是的,您应该创建一个单元子类并使用它。使用标签是一种糟糕的技术,子类使您有机会提供更合适的界面。通过设置要使用的索引路径,或通过传递要执行的块。
  2. 2& 3.在某种程度上未知,您还没有显示设置它的代码。但是,大多数问题是你将新单元格出列而不是获得当前单元格。您不应该将您不会使用的新单元格出列,否则会损坏表格视图单元格缓存。你也得到了我配置的单元格......

答案 1 :(得分:1)

您的所有UITableViewCell的发件人标签都是相同的,因为您要将相同的自定义单元格出列。

您应该将UITableViewCell子类化并将您的IBAction方法移动到该子类中。您还需要将故事板中的单元类更改为新的子类。

您可以使用与数据源中相同的类型在UItableViewCell子类中声明属性,并在cellForRowAtIndexPath方法中指定此属性。

然后在自定义单元格中的IBAction中,您将转到用户的配置文件屏幕,并传递自定义单元格中的对象或标签文本。然后,您将在prepareForSegue中获取目标视图控制器并将此属性分配给它。