初学者程序员试图理解为什么我无法完成这个简单的任务。我知道这很可能是一个非常简单的解决方案,但希望有人能解释为什么。
我有一个屏幕,用户可以在其中输入电子邮件到文本字段。这个想法是,如果在输入电子邮件时,如果它还没有存储在电子邮件中,它将提示用户将新的电子邮件/联系人输入商店。由于我在弹出用于创建联系人的屏幕之前检查电子邮件是否有效,我希望将输入的文本直接放入"电子邮件"新联系人创建页面上的字段,不允许编辑。我尝试了很多方法,但无法收到要在文本字段中显示的电子邮件。有人可以解释为什么会这样吗?
用户输入电子邮件的初始VC代码。如果商店中不存在该电子邮件,则会触发创建联系人创建者页面的代码:
//I created this custom initializer since setting the text field (as I did below) would not work
ContactCreationViewController *contactCreationVC = [[ContactCreationViewController alloc] initWithEmail:trimmedText];
contactCreationVC.delegate = self;
//initially I tried setting the text here but it did not work, I now understand why
//[contactCreationVC.emailField setText:@"asdsadasd"];
[contactCreationVC setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
[contactCreationVC setModalPresentationStyle:UIModalPresentationOverCurrentContext];
[self presentViewController:contactCreationVC animated:YES completion:nil];
这是实际ContactCreatorVC的代码:
-(instancetype) initWithEmail:(NSString*)email{
self = [super init];
//tried setting email here which works as I check with breakpoints
[self setEmail:email];
//self.email = email here when I check
return self;
}
....
- (nonnull UITableViewCell *)tableView:(nonnull UITableView *)tableView cellForRowAtIndexPath:(nonnull NSIndexPath *)indexPath {
switch (indexPath.row) {
....
case 3: {
ContactCreationTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:contactCreationCellIdentifier];
cell.titleLabel.text = @"E-Mail";
cell.userEntryTextfield.tag = 3;
cell.userEntryTextfield.delegate = self;
cell.userEntryTextfield.keyboardType = UIKeyboardTypeEmailAddress;
//I try setting the email here but self.email = nil (don't understand why)
cell.userEntryTextfield.text = [NSString stringWithFormat:@"%@", self.email];
cell.userEntryTextfield.userInteractionEnabled = NO;
cell.userEntryTextfield.autocapitalizationType = UITextAutocapitalizationTypeNone;
self.emailField = cell.userEntryTextfield;
return cell;
}
.....
}
即使提出这么简单的问题,我也感到愚蠢,但我显然不了解幕后发生的事情,因为我已经尝试过所有事情。任何人都能解释一下发生了什么,并从最佳实践的角度提出理想的解决方案吗?
编辑:我想我的问题可能更简洁......它基本归结为:为什么当我在init中设置self.email时,当我在cellForRow方法中访问self.email时它不会粘住(它变为零)?(文本字段位于tableview中的单元格中)
答案 0 :(得分:1)
问题在于这一行:
[contactCreationVC.emailField setText:@"asdsadasd"];
您刚刚创建了contactCreationVC
。它的视图未加载,因此emailField
为nil
(通过一些基本的日志记录很容易证明)。发送给nil
的邮件什么也没做。
正确的方法是:永远不要触摸另一个视图控制器的插座。设置其他视图控制器的属性,让 it 处理自己的出口。在这种情况下,其他视图控制器需要使用该属性在emailField
中设置text
viewDidLoad
。
至于为什么 方法对你不起作用,据我所知,没有足够的信息来回答它。如果你能证明事情按此顺序排列:
使用实际的电子邮件值调用ContactCreatorVC init
,并设置该属性。
该属性具有强(保留)策略,因此保留该值。
同一个ContactCreatorVC实例现在调用了cellForRowAtIndexPath
,当时该属性为nil
。
如果你可以证明这一点,那么唯一合乎逻辑的结论就是同时出现了一些其他代码并将属性设置为nil
。