【发布时间】:2017-08-17 11:16:32
【问题描述】:
我有两个视图控制器,视图控制器和 tableViewController。 ViewController 包含一个 textField 和一个按钮。当点击 viewController 中的按钮时,TableViewController 应该会启动。
在 TableViewController 中,有一个列表包含 5 行,每行包含一个字符串值。
我要做的是,当用户选择 TableViewController 列表中的任何行时,ViewController 场景应该启动并且用户选择的值应该显示在 ViewController 的文本字段中。
为了完成这个任务,我在 TableViewController 中创建了一个协议,其中包含一个名为 valueChoosen: (NSString *) value 的必需方法,该方法在 ViewController 中实现,然后我将值设置为 textField,但在运行时 TextField 为空。
请看下面的代码,让我知道为什么传递给协议所需方法的值不能设置到文本字段,我做错了什么;
TableViewController:
#import "TableViewController.h"
@interface TableViewController ()
@property NSArray *tableData;
@end
@implementation TableViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.tableData = [NSArray arrayWithObjects:@"Android",
@"iOS",
@"swift",
@"objective-c",
@"openCV",nil];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
-(NSInteger) tableView:(UITableView *)tableView
numberOfRowsInSection:(NSInteger)section {
return [self.tableData count];
}
-(UITableViewCell *) tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *simpleTableIdentifier = @"SimpleTableItem";
UITableViewCell *cell = [tableView
dequeueReusableCellWithIdentifier:simpleTableIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc]
initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:simpleTableIdentifier];
}
cell.textLabel.text = [self.tableData objectAtIndex:indexPath.row];
cell.imageView.image = [UIImage imageNamed:@"images.jpg"];
return cell;
}
-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:
(NSIndexPath *)indexPath {
NSLog(@"%@", [self.tableData objectAtIndex:indexPath.row]);
[self performSegueWithIdentifier:@"unwindSegue" sender:NULL];
[self.delegate valueChoosen:[self.tableData
objectAtIndex:indexPath.row]];
}
@end
视图控制器:
#import "ViewController.h"
#import "TableViewController.h"
@interface ViewController ()
@property (strong, nonatomic) IBOutlet UITextField
*textFieldDepartment;
@property (strong, nonatomic) IBOutlet UIButton
*buttonSelectFromTableView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a
nib.
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"segueToTableView"]) {
//code
TableViewController *table = segue.destinationViewController;
table.delegate = self;
}
}
-(void) valueChoosen: (NSString *) value {
[_textFieldDepartment setText:value];
NSLog(@"value: %@", value);
}
@end
【问题讨论】:
-
在执行展开转场之前调用委托方法
-
@StasVolskiy 我试过了,但文本字段仍然是空的
-
日志中列出了什么?委托方法调用了吗?
-
在头文件中添加代理
标签: ios objective-c delegates