Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 更新标签文本不需要';在重新加载UIView之前,我无法工作_Ios_Objective C_Uiview_Xib - Fatal编程技术网

Ios 更新标签文本不需要';在重新加载UIView之前,我无法工作

Ios 更新标签文本不需要';在重新加载UIView之前,我无法工作,ios,objective-c,uiview,xib,Ios,Objective C,Uiview,Xib,我正在努力解决一个我根本不理解的问题。下面是以下场景: 我尝试在iOS中创建多视图向导。经过深思熟虑后,我决定采用一种可能并不理想但有助于保持代码整洁的方法。我不想链接十个视图控制器并手动管理视图 该向导有一个视图控制器。开始时,它会将一定数量的UIView加载到视图中,并允许我左右滚动。代码如下 UIView是在interface builder中创建的,我有一个包含所有视图的XIB文件 每个UIView都有多个IBoutlet(例如标签),这些IBoutlet连接到文件所有者(在本例中为向导

我正在努力解决一个我根本不理解的问题。下面是以下场景:

  • 我尝试在iOS中创建多视图向导。经过深思熟虑后,我决定采用一种可能并不理想但有助于保持代码整洁的方法。我不想链接十个视图控制器并手动管理视图
  • 该向导有一个视图控制器。开始时,它会将一定数量的UIView加载到视图中,并允许我左右滚动。代码如下
  • UIView是在interface builder中创建的,我有一个包含所有视图的XIB文件
  • 每个UIView都有多个IBoutlet(例如标签),这些IBoutlet连接到文件所有者(在本例中为向导视图控制器)
  • 除了加载的UIView上的标签不更新之外,这一切都非常有效。问题是:

  • 我调用向导,它会立即加载所有UIView和Outlet
  • 我跳过向导
  • 但问题出现了:

    • 例如:
    • 步骤2有一个按钮可以调用地址簿(它可以工作)
    • 通讯簿打开,返回一个对象(可以正常工作)
    • 但当我赋值时,UIView“步骤2”上的标签不会更新
  • 只有从向导中删除此UIView并将其添加回后,它才能正常工作。在我看来,UIView加载正确,但对其输出的任何后续更改都不起作用

    顺便说一下,我验证了标签、按钮和所有东西可能都是连接在一起的。当标签作为XIB的一部分加载时,我无法更新标签,并且在初始加载后值会发生变化

    代码:

    加载UIView的向导:

    -(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];
    }