我有两个视图控制器,视图控制器和tableViewController。 ViewController包含一个textField和一个按钮。当单击viewController中的按钮时,TableViewController应该启动。
在TableViewController中,有一个包含5行的列表,每行包含一个字符串值。我想要做的是,当用户选择TableViewController列表中的任何行时,ViewController场景应该开始,用户选择的值应该显示在ViewController的文本字段中。
为了完成这个任务,我在TableViewController中使用一个名为valueChoosen: (NSString *) value
的必需方法创建了一个协议,这个方法在ViewController中实现,然后我将值设置为textField,但是在运行时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
的ViewController :
#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
答案 0 :(得分:0)
这可能是因为您在textfield
中设置了未显示的viewController
文本。尝试使用delegate
函数将值分配给变量,并在执行展开delegate
之前调用segue
函数。并在viewController
尝试将文本字段文本设置为通过viewWillAppear
方法的委托方法设置其值的变量。
答案 1 :(得分:0)
第1步:
在你想要展开它的viewcontroller中创建展开动作。在你的情况下它是ViewController
- (IBAction)unwindFromModalController:(UIStoryboardSegue *)segue{}
第3步
触发segue
TableViewController.m中的
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
self.selectedText = self.tableData[indexPath.row];
[self performSegueWithIdentifier:@"unwindSegue" sender:self];}
第4步:
传递数据
放松动作
- (IBAction)unwindFromModalController:(UIStoryboardSegue *)segue{
if ([segue.sourceViewController isKindOfClass:[TableViewController class]]) {
TableViewController *vc = segue.sourceViewController;
if (vc.selectedText) {
[_textFieldDepartment setText:vc.selectedText];}
}
}