Ios 更新标签文本不需要';在重新加载UIView之前,我无法工作
我正在努力解决一个我根本不理解的问题。下面是以下场景:Ios 更新标签文本不需要';在重新加载UIView之前,我无法工作,ios,objective-c,uiview,xib,Ios,Objective C,Uiview,Xib,我正在努力解决一个我根本不理解的问题。下面是以下场景: 我尝试在iOS中创建多视图向导。经过深思熟虑后,我决定采用一种可能并不理想但有助于保持代码整洁的方法。我不想链接十个视图控制器并手动管理视图 该向导有一个视图控制器。开始时,它会将一定数量的UIView加载到视图中,并允许我左右滚动。代码如下 UIView是在interface builder中创建的,我有一个包含所有视图的XIB文件 每个UIView都有多个IBoutlet(例如标签),这些IBoutlet连接到文件所有者(在本例中为向导
- 例如:
- 步骤2有一个按钮可以调用地址簿(它可以工作)
- 通讯簿打开,返回一个对象(可以正常工作)
- 但当我赋值时,UIView“步骤2”上的标签不会更新
-(void)configureWizard
{
self.showsHorizontalScrollIndicator = NO;
self.showsVerticalScrollIndicator = NO;
self.scrollEnabled = NO;
self.contentSize = CGSizeMake(CGRectGetWidth(self.frame) * [wizardDelegate numberOfSteps], CGRectGetHeight(self.frame));
self.delegate = self;
}
-(void)loadWizard
{
[self configureWizard];
[self updateNavButtonsIfNecessary];
currentIndex = 0;
for (int i = 0; i<[wizardDelegate numberOfSteps]; i++)
{
[self loadWizardStepAtIndex:i];
}
}
- (void)loadWizardStepAtIndex:(int)index {
CGRect frame = self.frame;
frame.origin.x = CGRectGetWidth(frame) * index;
frame.origin.y = 0;
UIView *view = [wizardDelegate viewForStepAtIndex:index];
view.frame = frame;
[self addSubview:view];
}
向导主视图控制器.m(文件所有者)
地址簿的返回功能
-(void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person
{
[self displayPersonRecord:person];
[self dismissViewControllerAnimated:YES completion:nil];
}
尝试更新第二个UIView上的标签(这就是问题发生的地方-它不起作用)
但正如我提到的,如果我重新加载视图,它就会工作(参见屏幕截图)
重载方法很重要:这是一个讨厌的代码,并没有在生产中使用,它只是一个测试,看看重新加载视图是否有帮助
-(void)refresh:(UIView *) oldView
{
[oldView removeFromSuperview];
CGRect frame = self.frame;
frame.origin.x = CGRectGetWidth(frame) * currentIndex;
frame.origin.y = 0;
//UIView *view = [wizardDelegate viewForStepAtIndex:currentIndex];
oldView.frame = frame;
[self addSubview:oldView];
}
如果此时我从向导中删除self.memberwizard_2视图,并将其添加回“一切正常”,但它不能立即运行。这可能与我启动UIView的方式有关吗?顺便说一下,最后一段中的NSLog也显示了联系人的姓名
如果有人知道更容易处理向导的方法,请告诉我:)PageViewController很痛苦,因为我需要在屏幕之间切换一个对象,但需要在每个屏幕中显示不同的操作
非常感谢,并为代码混乱表示歉意,我试图尽可能地把它弄清楚,但可能不是这样
我认为这是出问题的地方。对于每个“向导步骤”,调用
viewForStepAtIndex
,加载NIB并返回相关视图。然后将其添加为子视图。但当您处理下一个向导步骤时,NIB将再次加载,这将创建其所有对象的新实例,并将所有出口和操作重新连接到新加载的对象。因此,您刚才添加为子视图的视图(因此显示)不再由您的插座指向。因此,当您更新标签时,它不是在屏幕上更新标签,而是在根本不在层次结构中的视图上更新一个完全不同的标签
因此,我将修改您的代码,以便只运行一次
loadNibNamed:
方法。[self.wizardDelegate refresh:[self.memberwizard_2];此处的开始括号和结束括号的数目不同。首先,尝试修复此问题。[self.wizardDelegate refresh:self.memberwizard_2]
谢谢你的评论,但那是一个打字错误(或复制粘贴错误)。但这不是问题所在,因为我实际上不想使用此刷新方法。我正在试图找出标签为什么不首先更新。您是否尝试使用调试器单步检查代码?就在将新字符串分配给标签之前,如果使用NSLog,您会看到什么(@“对象:%@,视图:%@,子视图:%@,标签:%@”,self,self.memberwizard_2,self.View.Subviews,self.wizard 2_namelab)
?尝试从NIB唤醒,而不是将其加载到步骤索引的-(UIView*)视图中:(int)索引
。因为视图已经加载。请不要再加载一个。好了,它来了:我一定是因为盯着问题看而脑死亡。当然你是对的(安东尼奥也是)-我一次又一次地加载同一个东西,结果弄得一团糟。我现在更改了它,使视图控制器加载了笔尖并完成了…它就像一个符咒一样工作。就像我说的-脑死亡!非常感谢你的帮助-安东尼奥和你(当然还有其他人!)
-(void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person
{
[self displayPersonRecord:person];
[self dismissViewControllerAnimated:YES completion:nil];
}
-(void) displayPersonRecord:(ABRecordRef)person
{
NSString *firstName = (__bridge_transfer NSString*)ABRecordCopyValue(person, kABPersonFirstNameProperty);
NSString *lastName = (__bridge_transfer NSString*)ABRecordCopyValue(person, kABPersonLastNameProperty);
NSLog(@"Name is %@", [NSString stringWithFormat:@"%@ %@", firstName, lastName]);
self.wizard2_nameLabel.text = [NSString stringWithFormat:@"%@ %@", firstName, lastName];
[self.wizardDelegate refresh:self.memberwizard_2]; //if called, the current view will be removed and re-added - then the label gets updated.
}
-(void)refresh:(UIView *) oldView
{
[oldView removeFromSuperview];
CGRect frame = self.frame;
frame.origin.x = CGRectGetWidth(frame) * currentIndex;
frame.origin.y = 0;
//UIView *view = [wizardDelegate viewForStepAtIndex:currentIndex];
oldView.frame = frame;
[self addSubview:oldView];
}