在UITableViewCell和UITableViewController之间传递数据?

3

我在Xcode 4.6中创建了主从模板项目,并添加了一个带有2个文本字段的自定义单元格。我还创建了一个UITableViewCell子类的新类,在其中为文本字段创建了输出口。当用户输入时,NSMutableArray被更新,这很好用。现在我想知道如何将此数组传回MasterViewController(UITableViewController),以便我可以使用这些数据来显示计算结果。

我尝试使用UIViewController之间委托的教程,但始终出现错误。任何帮助都将不胜感激。


在您的单元子类中添加一个字段来包含指向控制器或其他需要访问的数据锚点的指针。在您的情况下,您可能会回调主VC以通信更新。 - Hot Licks
2个回答

2

不应该将数据保存在UITableViewCell中,因为这会破坏MVC。

您需要获取单元格中UITextField的引用。以下是我在登录表单中的做法:

我有一个名为TextFieldCell的自定义单元格子类,它有一个名为textField的outlet,我希望我的UITableViewController有对这些UITextField的引用。

首先,我打开我的storyboard,将单元格类设置为TextFieldCell,然后将UITextField连接到cell textField outlet。然后我将以下内容添加到tableView:cellForRowAtIndexPath:中:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    ()
    if (indexPath.row == 0) {
        // Sets the textField of the first cell as the loginTextField.
        self.loginTextField = tCell.textField;
    } else {
        // Sets the textField of the second cell as the passwordTextField.
        self.passwordTextField = tCell.textField;
    }
    tCell.textField.delegate = self;
    ()
}

现在我可以访问我的loginTextFieldpasswordTextField的值。 我在tableView:cellForRowAtIndexPath:上这样做,因为那是我正在创建要添加到表视图的单元格时。


但是当我收到错误消息说连接textField不能将原型对象作为其目标时,我怎么样才能为单元格创建插座呢? - James Douglas
你不能直接将Cell连接到View Controller,因为Cell不是一个真正的对象,它只是用来初始化对象的原型。你需要创建一个自定义的UITableViewCell子类,并连接你所需的outlets到UITextField 到cell上。 - Marco Pompei
我创建了一个UITableViewCell的子类,并且它可以正常工作。但是,我现在遇到了一个问题,就是如何将这些数据传递给其他类,例如UITableViewController? - James Douglas
你可以在UITableViewController中引用UITableViewCell来实现这个功能,而我则是在tableView:cellForRowAtIndexPath:方法中获取指向文本字段的变量。但是你也可以直接获取指向单元格的变量,然后访问该单元格内部的数据结构。需要注意的是,在视图中存储和特别处理数据通常是不好的做法。 - Marco Pompei

0
在您的情况下,您需要创建协议: 我只是提供了如何创建协议的基本思路。 还可以阅读这个问题
#DetailViewController.h

#import <UIKit/UIKit.h>

@protocol MasterDelegate <NSObject>
-(void) getButtonTitile:(NSString *)btnTitle;
@end


@interface DetailViewController : MasterViewController

@property (nonatomic, assign) id<MasterDelegate> customDelegate; 

#DetailViewController.m

if([self.customDelegate respondsToSelector:@selector(getButtonTitile:)])
{
          [self.customDelegate getButtonTitile:button.currentTitle];    
}

#MasterViewController.m

create obj of DetailViewController

DetailViewController *obj = [[DetailViewController alloc] init];
obj.customDelegate = self;
[self.navigationController pushViewController:reportTypeVC animated:YES];

and add delegate method in MasterViewController.m for get button title.

#pragma mark -
#pragma mark - Custom Delegate  Method

-(void) getButtonTitile:(NSString *)btnTitle;
{
    NSLog(@"%@", btnTitle);

}

你正在通过推送视图控制器来执行协议,而在我的情况下,这行代码是无用的,因为我从不是视图控制器的类中发送数据: [self.navigationController pushViewController:enterAmountVC animated:YES]; - James Douglas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接