每个 TableViewCell 的 IBAction 不返回唯一的 NSIndexPath
IBAction for each TableViewCell not returning unique NSIndexPath
当我点击他们的用户名时,我正试图转到用户的个人资料屏幕(见下面的屏幕截图)。我有一个带有 UITableViewCell
提要的 UITableViewController
,每个提要都有一个 usernameLabel
(UILabel) 和一个直接位于 [=13= 顶部的透明 userNameButton
(UIButton) ] 以便 UILabel 可见。该按钮本质上就像一个 'hit area'。我知道我应该删除 UILabel 并更新 UIButton 的文本以说出用户名,但那是另一回事了。
这是我的 IBAction(这里还没有 Segue 代码):
@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!)")
}
几个问题:
- 我的
usernameButtonPressed
在我的 UITableViewController 中。我应该把这个 IBAction 放在 UITableViewCell 的 class 中吗?或者这里还好吗?
- 我打印的
indexPath
每个 table 单元格都完全一样。为什么是这样?我的 sender.tag
不会更新为不同的 int 值吗?
- 我认为由于 #2,每个 table 单元格都返回了不正确的用户名字符串。
总的来说,我执行此操作的目标是从特定用户获取每个相应 table 视图单元格的用户(或对象)信息,以便我可以正确地转到该特定用户配置文件。显然我将需要更多代码来执行此操作,但这是我尝试此操作的开始,此时我纯粹是在尝试为每个单元格获取正确的用户名。
这是 TableView 的屏幕截图,试图提供更多上下文:
- 是的,您应该创建一个单元格子类并使用它。使用标签是一种糟糕的技术,子类让您有机会提供更合适的接口。通过设置要使用的索引路径,或者通过传递要执行的块。
2 & 3. 在某种程度上未知,您没有显示设置它的代码。但是,大多数问题是您要使新单元格出队而不是获取当前单元格。您不应该使不打算使用的新单元格出列,否则会损坏 table 视图单元格缓存。您还会得到一个我配置的单元...
所有 UITableViewCell 的发件人标签都是相同的,因为您要出列相同的自定义单元格。
您应该子class UITableViewCell 并将您的IBAction 方法移动到该子class 中。您还需要将故事板中的单元格 class 更改为新的子 class.
您可以在 UItableViewCell subclass 中声明一个 属性,其类型与您在数据源中的类型相同,并在 cellForRowAtIndexPath 方法中分配此 属性。
然后在您的自定义单元格的 IBAction 中,您转到用户的个人资料屏幕并传递自定义单元格中的对象或标签文本。然后,您将在 prepareForSegue 中获取目标视图控制器并将此 属性 分配给它。
当我点击他们的用户名时,我正试图转到用户的个人资料屏幕(见下面的屏幕截图)。我有一个带有 UITableViewCell
提要的 UITableViewController
,每个提要都有一个 usernameLabel
(UILabel) 和一个直接位于 [=13= 顶部的透明 userNameButton
(UIButton) ] 以便 UILabel 可见。该按钮本质上就像一个 'hit area'。我知道我应该删除 UILabel 并更新 UIButton 的文本以说出用户名,但那是另一回事了。
这是我的 IBAction(这里还没有 Segue 代码):
@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!)")
}
几个问题:
- 我的
usernameButtonPressed
在我的 UITableViewController 中。我应该把这个 IBAction 放在 UITableViewCell 的 class 中吗?或者这里还好吗? - 我打印的
indexPath
每个 table 单元格都完全一样。为什么是这样?我的sender.tag
不会更新为不同的 int 值吗? - 我认为由于 #2,每个 table 单元格都返回了不正确的用户名字符串。
总的来说,我执行此操作的目标是从特定用户获取每个相应 table 视图单元格的用户(或对象)信息,以便我可以正确地转到该特定用户配置文件。显然我将需要更多代码来执行此操作,但这是我尝试此操作的开始,此时我纯粹是在尝试为每个单元格获取正确的用户名。
这是 TableView 的屏幕截图,试图提供更多上下文:
- 是的,您应该创建一个单元格子类并使用它。使用标签是一种糟糕的技术,子类让您有机会提供更合适的接口。通过设置要使用的索引路径,或者通过传递要执行的块。
2 & 3. 在某种程度上未知,您没有显示设置它的代码。但是,大多数问题是您要使新单元格出队而不是获取当前单元格。您不应该使不打算使用的新单元格出列,否则会损坏 table 视图单元格缓存。您还会得到一个我配置的单元...
所有 UITableViewCell 的发件人标签都是相同的,因为您要出列相同的自定义单元格。
您应该子class UITableViewCell 并将您的IBAction 方法移动到该子class 中。您还需要将故事板中的单元格 class 更改为新的子 class.
您可以在 UItableViewCell subclass 中声明一个 属性,其类型与您在数据源中的类型相同,并在 cellForRowAtIndexPath 方法中分配此 属性。
然后在您的自定义单元格的 IBAction 中,您转到用户的个人资料屏幕并传递自定义单元格中的对象或标签文本。然后,您将在 prepareForSegue 中获取目标视图控制器并将此 属性 分配给它。