iOS строит представление программно в зависимости от объекта ivar - PullRequest
1 голос
/ 15 июня 2011

У меня довольно забавная проблема, которая включает loadView, viewDidLoad, viewWillAppear и состояние ивара. У меня есть приложение на основе навигации. И из моего первого уровня просмотра у меня есть список таблиц, а затем я нажимаю на одну из ячеек, и я перехожу на второй уровень (подробный вид). Когда я нажимаю на ячейку, я также добавляю объект «Office» (который содержит строки типа streetAddress и boxAddress) в контроллер представления, который выдвигается. Затем я заполняю подробный вид содержимым объекта Office, например [box setText:[self.office boxAddress]]; (поле - UILabel). Теперь я хочу добиться того, чтобы иногда stringValue boxAddress было пустым, и в этих случаях я не хочу добавлять пустую строку в UILabel, вместо этого я хочу переместить следующую UILabel вверх (и занять место boxAddress). Поэтому я сделал условную проверку, чтобы увидеть, пусто ли boxAddress, если это так, нужно установить UILabel s с конкретными координатами, а если оно не пустое, установить UILabel s с другими конкретными координатами.

Я понимаю, что вы должны использовать viewWillAppear, если вы хотите, чтобы код запускался при каждой загрузке представления. Но почему-то кажется, что viewWillAppear запускается только тогда, когда строка boxAddress пуста. И если я щелкну ячейку с пустой boxAddress, она будет использовать значение из boxAddress из последней ячейки, которую я щелкнул, у которой была непустая boxAddress.

Я вставлю свой код сюда, чтобы посмотреть, сможете ли вы дать мне указатель на то, что я здесь делаю неправильно.

// Implement loadView to create a view hierarchy programmatically, 
// without using a nib.
- (void)loadView {

    //allocate the view
    self.view = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];

    //set the view's background color
    self.view.backgroundColor = [UIColor whiteColor];
}

- (void)viewDidLoad
{

    //add the labels
    name = [[UILabel alloc] initWithFrame:CGRectMake(10.0,10.0,320.0,20.0)];
    [name setBackgroundColor:[UIColor clearColor]];
    [name setTextColor:[UIColor blackColor]];

    street = [[UILabel alloc] initWithFrame:CGRectMake(10.0,30.0,320.0,20.0)];
    [street setBackgroundColor:[UIColor clearColor]];
    [street setTextColor:[UIColor blackColor]];

    //if no box address, move up the rest of the addresses
    if ([[self.office boxAddress] length] == 0) {

        zip = [[UILabel alloc] initWithFrame:CGRectMake(10.0,50.0,320.0,20.0)];
        [zip setBackgroundColor:[UIColor clearColor]];
        [zip setTextColor:[UIColor blackColor]];

        phone = [[UILabel alloc] initWithFrame:CGRectMake(10.0,70.0,320.0,20.0)];
        [phone setBackgroundColor:[UIColor clearColor]];
        [phone setTextColor:[UIColor blackColor]];

        fax = [[UILabel alloc] initWithFrame:CGRectMake(10.0,90.0,320.0,20.0)];
        [fax setBackgroundColor:[UIColor clearColor]];
        [fax setTextColor:[UIColor blackColor]];

        [self.view addSubview:name];
        [self.view addSubview:street];
        [self.view addSubview:zip];
        [self.view addSubview:phone];
        [self.view addSubview:fax];

    } else {

        box = [[UILabel alloc] initWithFrame:CGRectMake(10.0,50.0,320.0,20.0)];
        [box setBackgroundColor:[UIColor clearColor]];
        [box setTextColor:[UIColor blackColor]];

        zip = [[UILabel alloc] initWithFrame:CGRectMake(10.0,70.0,320.0,20.0)];
        [zip setBackgroundColor:[UIColor clearColor]];
        [zip setTextColor:[UIColor blackColor]];

        phone = [[UILabel alloc] initWithFrame:CGRectMake(10.0,90.0,320.0,20.0)];
        [phone setBackgroundColor:[UIColor clearColor]];
        [phone setTextColor:[UIColor blackColor]];

        fax = [[UILabel alloc] initWithFrame:CGRectMake(10.0,110.0,320.0,20.0)];
        [fax setBackgroundColor:[UIColor clearColor]];
        [fax setTextColor:[UIColor blackColor]];

        [self.view addSubview:name];
        [self.view addSubview:street];
        [self.view addSubview:box];
        [self.view addSubview:zip];
        [self.view addSubview:phone];
        [self.view addSubview:fax];
    }

    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
}

// viewWillAppear method is run every time the view is loaded as opposite to the viewDidLoad method which only is run once
// in this program DisclosureDetail view needs to be loaded for each detail view with different content each time
- (void)viewWillAppear:(BOOL)animated {

    NSLog(@"%@", [self.office boxAddress]);

    [name setText:[self.office name]];
    [street setText:[self.office streetAddress]];
    if ([[self.office boxAddress] length] > 0) {
        [box setText:[self.office boxAddress]];
    }
    [zip setText:[NSString stringWithFormat:@"%@ %@", [self.office zipCode], [self.office city]]];
    [phone setText:[self.office phoneNo]];
    [fax setText:[self.office faxNo]];

    [super viewWillAppear:animated];
}

1 Ответ

0 голосов
/ 15 июня 2011
if ([[self.office boxAddress] length] > 0) {
    [box setText:[self.office boxAddress]];
}

Если длина boxAddress равна 0, то box будет по-прежнему содержать любой текст, который вы указали в него при последнем появлении представления.

Вам нужно будет скрытьи показывать box каждый раз, когда представление отображается не только при загрузке представления, поскольку представление может быть загружено и затем использовано для отображения нескольких различных office s.

...