Значения не обновляются в AppDelegate

Мне нужно хранить целые числа и некоторые числа с плавающей запятой, чтобы делиться ими между представлениями, я знаю, что делать это в AppDelegate — оплошность, но это вводный курс по iOS, который я прохожу, и мы совсем не продвинулись, я имею в виду ВООБЩЕ (никакой парадигмы MVC, никаких уроков по Objective-C, никаких основных данных, никаких ошибок, с которыми мы можем столкнуться, или способов их обработки и т. д.). Мое приложение предназначено для серверов в ресторане, у меня есть 6 представлений, загруженных как подпредставления из ViewController приложения с различными элементами для заказа с помощью кнопок «+» и «-», чтобы увеличить или уменьшить заказанное количество. В AppDelegate у меня есть int и float для каждого количества элементов и промежуточный итог, который я объявил как свойства.

При каждом изменении количества элемента он вызывает метод для обновления счетчика элементов, отображения количества, а также обновления и отображения промежуточного итога для этого представления. В этом методе я также создаю экземпляр (?) делегата, чтобы иметь доступ к объявленным свойствам int и float.

-(void)updateAppSubtotal{
    NSString *preSubString;
    NSString *subString;

    Final2AppDelegate* delegate = (Final2AppDelegate *)[[UIApplication sharedApplication]delegate];
    delegate.eggTotal = eggs;
    delegate.craTotal = crabs;
    delegate.capTotal = caps;
    delegate.quiTotal = quis;
    delegate.bruTotal = brus;
    delegate.pepTotal = peps;
    delegate.tarTotal = tars;
    delegate.balTotal = bals;
    delegate.appSubtotal = appSub;

    appSub = (eggs*eggPrice)+(crabs*crabPrice)+(caps*capPrice)+(quis*quiPrice)+(brus*bruPrice)+
(peps*pepPrice)+(tars*tarPrice)+(bals*balPrice);

    if(appSub < 10){
        preSubString = [[NSString alloc]initWithFormat:@"%1.2f",appSub];
    }else if(appSub < 100 && appSub >= 10){
        preSubString = [[NSString alloc]initWithFormat:@"%2.2f",appSub];
    }else if(appSub < 1000 && appSub >= 100){
        preSubString = [[NSString alloc]initWithFormat:@"%3.2f",appSub];
    }else{
        preSubString = [[NSString alloc]initWithFormat:@"%4.2f",appSub];
    }
    subString = [[NSString alloc]initWithFormat:@"$%@",preSubString];
    appSubtotal.text = subString;


    [preSubString release];
    [subString release];
}

Затем в представлении «счета» я использую это, чтобы (попытаться) заполнить метки количествами и промежуточными суммами:

- (void)viewDidLoad {
    
    NSString *preSubString;
    NSString *subString;
    NSString *preTaxString;
    NSString *taxString;
    NSString *preTotString;
    NSString *totString;
    
    Final2AppDelegate *delegate = (Final2AppDelegate *)[[UIApplication sharedApplication]delegate];

    subFloat = delegate.appSubtotal + delegate.bevSubtotal + delegate.entSubtotal + delegate.sidSubtotal +
delegate.desSubtotal;

    if(subFloat < 10){
        preSubString = [[NSString alloc]initWithFormat:@"%1.2f",subFloat];
    }else if(subFloat < 100 && subFloat >= 10){
        preSubString = [[NSString alloc]initWithFormat:@"%2.2f",subFloat];
    }else if(subFloat < 1000 && subFloat >= 100){
        preSubString = [[NSString alloc]initWithFormat:@"%3.2f",subFloat];
    }else{
        preSubString = [[NSString alloc]initWithFormat:@"%4.2f",subFloat];
    }
    subString = [[NSString alloc]initWithFormat:@"$%@",preSubString];
    billSubtotal.text = subString;

    taxFloat = subFloat*taxRate;
    if(taxFloat < 10){
        preTaxString = [[NSString alloc]initWithFormat:@"%1.2f",taxFloat];
    }else if(taxFloat < 100 && taxFloat >= 10){
        preTaxString = [[NSString alloc]initWithFormat:@"%2.2f",taxFloat];
    }else if(taxFloat < 1000 && taxFloat >= 100){
        preTaxString = [[NSString alloc]initWithFormat:@"%3.2f",taxFloat];
    }else{
        preTaxString = [[NSString alloc]initWithFormat:@"%4.2f",taxFloat];
    }
    taxString = [[NSString alloc ]initWithFormat:@"$%@",preTaxString];
    tax.text = taxString;

    totalFloat = subFloat + taxFloat;
    if(totalFloat < 10){
        preTotString = [[NSString alloc]initWithFormat:@"%1.2f",totalFloat];
    }else if(totalFloat < 100 && totalFloat >= 10){
        preTotString = [[NSString alloc]initWithFormat:@"%2.2f",totalFloat];
    }else if(totalFloat < 1000 && totalFloat >= 100){
        preTotString = [[NSString alloc]initWithFormat:@"%3.2f",totalFloat];
    }else{
        preTotString = [[NSString alloc]initWithFormat:@"%4.2f",totalFloat];
    }

    totString = [[NSString alloc]initWithFormat:@"$%@",preTotString];
    total.text = totString;
    
    eggFinalQty.text = [NSString stringWithFormat:@"%d",delegate.eggTotal];
    crabFinalQty.text = [NSString stringWithFormat:@"%d",delegate.craTotal];
    capFinalQty.text = [NSString stringWithFormat:@"%d",delegate.capTotal];
    quiFinalQty.text = [NSString stringWithFormat:@"%d",delegate.quiTotal];
    bruFinalQty.text = [NSString stringWithFormat:@"%d",delegate.bruTotal];
    pepFinalQty.text = [NSString stringWithFormat:@"%d",delegate.pepTotal];
    tarFinalQty.text = [NSString stringWithFormat:@"%d",delegate.tarTotal];
    balFinalQty.text = [NSString stringWithFormat:@"%d",delegate.balTotal];
    oldFinalQty.text = [NSString stringWithFormat:@"%d",delegate.oldTotal];
    vodkaFinalQty.text = [NSString stringWithFormat:@"%d",delegate.vodTotal];
    martiniFinalQty.text = [NSString stringWithFormat:@"%d",delegate.martTotal];
    redFinalQty.text = [NSString stringWithFormat:@"%d",delegate.redTotal];
    whiteFinalQty.text = [NSString stringWithFormat:@"%d",delegate.whiTotal];
    ipaFinalQty.text = [NSString stringWithFormat:@"%d",delegate.ipaTotal];
    oliFinalQty.text = [NSString stringWithFormat:@"%d",delegate.oldTotal];
    ribFinalQty.text = [NSString stringWithFormat:@"%d",delegate.ribTotal];
    ravFinalQty.text = [NSString stringWithFormat:@"%d",delegate.ravTotal];
    coqFinalQty.text = [NSString stringWithFormat:@"%d",delegate.coqTotal];
    bufFinalQty.text = [NSString stringWithFormat:@"%d",delegate.bufTotal];
    walFinalQty.text = [NSString stringWithFormat:@"%d",delegate.walTotal];
    cubFinalQty.text = [NSString stringWithFormat:@"%d",delegate.cubTotal];
    bleFinalQty.text = [NSString stringWithFormat:@"%d",delegate.bleTotal];
    sauFinalQty.text = [NSString stringWithFormat:@"%d",delegate.sauTotal];
    cacFinalQty.text = [NSString stringWithFormat:@"%d",delegate.cacTotal];
    souFinalQty.text = [NSString stringWithFormat:@"%d",delegate.souTotal];
    pesFinalQty.text = [NSString stringWithFormat:@"%d",delegate.pesTotal];
    temFinalQty.text = [NSString stringWithFormat:@"%d",delegate.temTotal];
    salFinalQty.text = [NSString stringWithFormat:@"%d",delegate.salTotal];
    lobFinalQty.text = [NSString stringWithFormat:@"%d",delegate.lobTotal];
    dreFianlQty.text = [NSString stringWithFormat:@"%d",delegate.dreTotal];
    marFinalQty.text = [NSString stringWithFormat:@"%d",delegate.marTotal];
    cheFinalQty.text = [NSString stringWithFormat:@"%d",delegate.cheTotal];
    fonFinalQty.text = [NSString stringWithFormat:@"%d",delegate.fonTotal];
    mouFinalQty.text = [NSString stringWithFormat:@"%d",delegate.mouTotal];
    pieFinalQty.text = [NSString stringWithFormat:@"%d",delegate.pieTotal];
    hazFinalQty.text = [NSString stringWithFormat:@"%d",delegate.hazTotal];
    briFinalQty.text = [NSString stringWithFormat:@"%d",delegate.briTotal];
    choFinalQty.text = [NSString stringWithFormat:@"%d",delegate.choTotal];
    iceFinalQty.text = [NSString stringWithFormat:@"%d",delegate.iceTotal];

    [preSubString release];
    [subString release];
    [preTaxString release];
    [taxString release];
    [preTotString release];
    [totString release];

    [super viewDidLoad];
}

Но когда представление загружает все метки количества для каждого элемента, а метки для налога, промежуточного итога и итога равны 0. Кажется, что значения не обновляются, и я не уверен, почему. Я разговаривал со своим другом, который посещал этот курс в прошлом семестре (я провожу целенаправленное исследование, так что большое спасибо всем на StackOverflow за то, что вы являетесь моим источником информации и идей), и я делаю почти то же самое. вещь, которую он сделал.

Почему значения в delegate не обновляются?

F.Y.I. У меня есть аналогичный метод обновления для каждого представления, и каждое из них использует Final2AppDelegate *delegate = (Final2AppDelegate *)[[UIApplication sharedApplication]delegate];. Будет ли это иметь какое-то отношение к этому, поскольку существует несколько экземпляров (?) делегата?


Редактировать


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


Редактировать 2


Поэтому я сделал метки в представлении напитков, которые обновляются до значения delegate.foo, и кажется, что они обновляются правильно, и я использовал те же операторы, которые я пытался заставить работать в представлении «Счет», чтобы отображать подсчеты. и это тоже работало правильно. Что-то происходит посередине? Я собираюсь попробовать добавить новую метку в представление закусок, которая обновляется с учетом количества одного из напитков, чтобы увидеть, будет ли это обмениваться данными между представлениями.


Редактировать 3


Ну, это тоже не сработало (я не знаю, почему я подумал, что это может быть), поэтому, очевидно, есть некоторые проблемы с попыткой доступа к данным из разных представлений. Поскольку все мои ViewControllers просто получают указатели на один и тот же экземпляр каждый раз, я не вижу, как это будет иметь значение. Я могу получить доступ к значениям в представлении, в котором я их создаю, но если я попытаюсь из других представлений, я просто получу 0. У кого-нибудь есть больше информации, чтобы пролить свет на это?

Может быть, использование ViewController приложения, в котором все остальные представления являются подвидами вместо AppDelegate, имеет значение?

Также я создаю новый указатель на AppDelegate каждый раз, когда вызывается метод обновления, то есть каждый раз, когда нажимается одна из кнопок плюс или минус. Это вообще повлияет?


Код контроллера просмотра приложений


Вот как я контролирую просмотры. Я думал, что viewDid/WillAppear и viewDid/WillDisappear могут не вызываться из-за того, как они контролируются, но это выше моего понимания. Я знаю, что код длиннее, чем должен быть, но на данный момент я просто пытаюсь завершить этот проект и покончить с этим целенаправленным исследованием! :D

-(IBAction)loadBeverageView:(id)sender{
    [self clearView];
    [self.view insertSubview:beverageViewController.view atIndex:0];
}

-(IBAction)loadAppetizerView:(id)sender{
    [self clearView];
    [self.view insertSubview:appetizerViewController.view atIndex:0];
}    

-(IBAction)loadEntreeView:(id)sender{
    [self clearView];
    [self.view insertSubview:entreeViewController.view atIndex:0];
}

-(IBAction)loadSideView:(id)sender{
    [self clearView];
    [self.view insertSubview:sideViewController.view atIndex:0];
}

-(IBAction)loadDessertView:(id)sender{
    [self clearView];
    [self.view insertSubview:dessertViewController.view atIndex:0];
}

-(IBAction)loadBillView:(id)sender{
    [self clearView];
    [self.view insertSubview:billViewController.view atIndex:0];
}

-(void)clearView{
    if(beverageViewController.view.superview){
        [beverageViewController.view removeFromSuperview];
    }else if(appetizerViewController.view.superview){
        [appetizerViewController.view removeFromSuperview];
    }else if(entreeViewController.view.superview){
        [entreeViewController.view removeFromSuperview];
    }else if(sideViewController.view.superview){
        [sideViewController.view removeFromSuperview];
    }else if(dessertViewController.view.superview){
        [dessertViewController.view removeFromSuperview];
    }else{
        [billViewController.view removeFromSuperview];
    }
}

person JustLikeThat    schedule 14.12.2011    source источник


Ответы (1)


Ваша проблема, вероятно, в том, что вы пытаетесь обновить представление счета в viewDidLoad. Если вы уже загрузили этот viewController или добавили его в контроллер панели вкладок или что-то еще, тогда viewDidLoad не будет вызываться снова - это вызывается только один раз, когда ваш контроллер представления завершил загрузку своих представлений из пера (или вручную).

Чтобы обновить представление, когда оно представлено другим контроллером, viewWillAppear является стандартным методом для использования, хотя он не будет вызываться, если вы меняете представления так, как вы это делаете в своем вопросе. Если ваша цель состоит в том, чтобы просто покончить с этим кошмаром, вы можете просто вручную вызвать viewWillAppear (не уверен, что это имеет какие-либо побочные эффекты) или поместить свою логику обновления в новый метод и вызывать его каждый раз, когда вы представляете одно из ваших представлений.

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

Кроме того, ваш вызов делегата приложения в порядке - вы не создаете новые экземпляры, а просто каждый раз получаете указатели на один и тот же экземпляр.

Я надеюсь, что вы только потратили время на этот курс, а не деньги!

person jrturton    schedule 14.12.2011
comment
Мне не нужно было бы использовать NSInteger и NSDecimal, не так ли? - person JustLikeThat; 15.12.2011
comment
Нет, то, что у вас есть, в порядке и не имеет отношения к вашей проблеме. Вы сделали, как я предложил, и поставили точки останова в методах, где вы пытаетесь обновить счет? Как вы отображаете различные виды — в виде вкладок, в навигационном контроллере или в чем-то, что вы сделали сами? - person jrturton; 15.12.2011
comment
Я пытался сделать точки останова, но они никогда не работали, я поработаю с ними еще немного и посмотрю, что я могу сделать. Представления не в виде вкладок, они управляются с помощью панели инструментов, я опубликую код в своем вопросе для вас. Я не уверен, что методы, которые я пытаюсь использовать, работают, потому что они контролируются, и я думаю об этом со вчерашнего дня. Код выше, и большое спасибо за помощь! - person JustLikeThat; 15.12.2011
comment
Я обновил второй абзац своего ответа. Если вы представляете такие представления, вам придется вручную вызывать метод обновления. Я надеюсь, что этот курс не оттолкнул вас от iOS-разработки, и вы снова начнете с нуля! Есть множество хороших ресурсов, Стэнфордские на iTunes U — хорошее место для начала. - person jrturton; 15.12.2011