Значения не обновляются в AppDelegate - PullRequest
0 голосов
/ 15 декабря 2011

Мне нужно хранить целые и некоторые числа с плавающей точкой, чтобы делиться ими между представлениями. Я знаю, что делать это в 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 каждый раз, когда вызывается метод обновления, то есть каждый раз, когда нажимается одна из кнопок плюс или минус. Повлияет ли это на все это?


App View Controller Code


Вот так я контролирую взгляды. Я думал, что 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];
    }
}

1 Ответ

2 голосов
/ 15 декабря 2011

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

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

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

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

Надеюсь, вы потратили на этот курс только 1009 * раз , а не деньги!

...