如何使用函数dequeueReusableCellWithIdentifier:forIndexPath?

时间:2015-03-17 11:57:14

标签: ios objective-c uitableview

我知道dequeueReusableCellWithIdentifier:forIndexPath是由tableviewcontroller中的tableView方法调用的。如果我理解正确,则会多次调用tableView方法,直到填充了所有单元格。但我不知道的是,您从哪里获得参数IndexPath的值?我想使用dequeueReusableCellWithIdentifier:forIndexPath作为我创建的方法,因为我想访问我的单元格以复制其属性的某些值。

注意: 我已经填充了我的单元格,这意味着我成功使用了方法tableView。

(编辑)附加信息 我正在尝试创建个人资料并编辑个人资料表格视图。在配置文件tableview中,我显示了用户的姓名,地址,联系人#等。另外,我有一个名为编辑个人资料的segue。在编辑配置文件中,我有每个类别(名称,地址等)的文本字段。我想要做的是,如果我编辑文本字段的内容,我应该能够在我的配置文件tableview中显示新内容。一个示例案例是:在个人资料视图中我显示 - > name:human,address:earth(每个都在自己的单元格中)。现在,如果我去editprofile tableview,我将编辑内容,以便 - >姓名:外星人,地址:火星。之后,有一个名为' apply'的按钮。结束内容编辑并返回配置文件tableview。如果我回到个人资料视图,显示现在应该是名字:外星人,地址:火星而不是名字:人类,地址:地球。

以下是一些代码,如果有任何帮助的话。该代码由tableviewcontroller中的按钮调用。 "&了myCell#34;是我的细胞类。此代码无法正常运行。我希望有人可以帮我解决这个问题。

- (IBAction)updateCopies:(id)sender {
       static NSString *ident = @"MyCell";
       NSIndexPath *indexPath;
       //create cell
       MyCell *cell = [self.tableView dequeueReusableCellWithIdentifier:ident forIndexPath:indexPath];
       //create variable for accessing cells
       int row = [indexPath row];
       _labelValues[row] = cell.textField.text

}

4 个答案:

答案 0 :(得分:2)

当您需要为要显示的单元格提供表格视图时,您应该只使用dequeueReusableCellWithIdentifier。如果要在特定索引处获取UITableViewCell对象,则应使用cellForRowAtIndexPath

您的问题

你真正需要的是一个模型类。然后,您可以将其传递给编辑控制器,从而更改属性。然后当您返回tableView时,可以重新加载它并显示新属性。

您还可以为编辑配置文件控制器创建一个委托协议,例如EditProfileViewControllerDelegate,如下所示:

protocol EditProfileViewControllerDelegate {
    - (void)editProfileViewController:(EditProfileViewController *)controller didUpdateName:(NSString *)name address:(NSString *)address;
}

您可以在表视图控制器中实现此委托,并在更改文本时使用它来更新值。但是,这很快变得笨拙,我不建议使用适当的模型类。

答案 1 :(得分:0)

使用此

- (IBAction)updateCopies:(id)sender {
 MyCell *parentCell = (MyCell *)sender.superview;

while (![parentCell isKindOfClass:[MyCell class]]) {   // iOS 7 onwards the table cell hierachy has changed.
    parentCell = parentCell.superview;
}

UIView *parentView = parentCell.superview;

while (![parentView isKindOfClass:[UITableView class]]) {   // iOS 7 onwards the table cell hierachy has changed.
    parentView = parentView.superview;
}


UITableView *tableView = (UITableView *)parentView;
NSIndexPath *indexPath = [tableView indexPathForCell:(MyCell *)parentCell];

NSLog(@"indexPath = %@", indexPath);
}

答案 2 :(得分:0)

您可以使用CGPoint获取indexPath。您可以使用dequeueResusableCell来重用该单元格。

- (IBAction)updateCopies:(id)sender {
  CGPoint position = [sender convertPoint:CGPointZero
                                   toView:self.tableView];
  NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:position];
       //create variable for accessing cells
  MyCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
       int row = [indexPath row];
 _labelValues[row] = cell.textField.text
}

希望它可以帮助你..

答案 3 :(得分:0)

嗯,我得到了你想要完成的任务。

首先,当您单击/选择一个单元格并转到“编辑个人资料”页面时,会调用delegate。那个代表是

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    ///
}

创建一个全局变量,例如selectedIndexPath,它保存正在编辑的当前单元格索引路径。每次进入编辑个人资料页面时都会更新此值。

喜欢这个

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    selectedIndexPath = indexPath;

    // code to go to edit page...
}

现在在updateCopies方法中,请执行此操作

- (IBAction)updateCopies:(id)sender {

       //get the existing cell with the indexPath
       [self.tableView beginUpdates];
       [self.tableView reloadRowsAtIndexPaths:@[selectedIndexPath]];
       [self.tableView endUpdates];

     //rest of your code goes here...
}