Ios 了解通知和更新属性

Ios 了解通知和更新属性,ios,uinavigationcontroller,delegates,nsnotificationcenter,nsnotifications,Ios,Uinavigationcontroller,Delegates,Nsnotificationcenter,Nsnotifications,我有一个拍照应用程序,它有一个PhotoViewController,代码如下,用于通知。此视图控制器上还有一个按钮,用于启动拍照视图控制器,该控制器以模式打开,并通过委派显示在PhotoViewController中 PhotoViewVC.h包含: @interface PhotoViewVC : UIViewController <UITextViewDelegate, PhotoTakingVCDelegate> // Photo data @property (nonat

我有一个拍照应用程序,它有一个PhotoViewController,代码如下,用于通知。此视图控制器上还有一个按钮,用于启动拍照视图控制器,该控制器以模式打开,并通过委派显示在PhotoViewController中

PhotoViewVC.h包含:

@interface PhotoViewVC : UIViewController <UITextViewDelegate, PhotoTakingVCDelegate>

// Photo data
@property (nonatomic, strong) NSData *photoData;
@property (nonatomic, strong) NSString *photoText;
@property (nonatomic, strong) NSString *photoObject;
@property (nonatomic, strong) NSString *photoParentObject;
@property (nonatomic, strong) NSString *photoUsername;
@property (nonatomic, strong) NSNumber *photoBestCount;
@property (nonatomic, strong) NSNumber *photoReplyCount;
@property (nonatomic, strong) NSMutableAttributedString *photoLabel;
@property (nonatomic, assign) BOOL photoViewerAddedBests;

@end
我很难使我的计数增加。所以我的应用程序是这样工作的:

  • PhotoTakingVC启动并创建所有最佳计数(初始值为0)
  • PhotoViewVC已正确加载,最佳计数为0
  • 用户在PhotoViewVC上并单击回复按钮
  • PhotoTakingVC弹出并拍照
  • PhotoViewVC为新照片创建自身的新实例
  • 用户点击PhotoViewVC第二个实例上的“后退”按钮,返回第一个实例
  • 最佳计数设置为1,这是正确的
  • 在PhotoViewVC的第一个实例上再次点击回复
  • 再次弹出PhotoTakingVC并保存照片及其数据
  • PhotoViewVC通过委派创建另一个PhotoViewVC实例(第三个)
  • 用户点击第三个实例返回第一个实例
  • 最佳计数仍然是1,应该是2
  • 为什么_photoBestCount每次从0开始,而不是持续增加?

    在步骤10中,您陈述:

    PhotoViewVC通过委派创建另一个PhotoViewVC实例(第三个)


    每次创建新VC时,您都在创建一个新的iVar
    \u photoBestCount
    ,初始化为零。因此,如果您想要一个持久计数器,只需将该属性放入一个模型类中(称之为PhotoCounter,或其他任何名称)。创建此类的实例并将其传递到PhotoViewVC。现在,每次更新此iVar时,您都使用相同的计数器,而不是新的计数器

    您是否可以更新您的帖子,添加相关iVar的定义,如
    \u photoBestCount
    ?立即更新一秒钟,以便创建一个具有计数属性的新视图控制器?“将其传递到PhotoViewVC”是什么意思?不,创建一个具有计数属性的新类。那是你的模型对象。现在,在调用PhotoViewVC(在实例化PhotoViewVC的VC内部)之前创建这个类的一个实例,并将这个对象传递给PhotoViewVC(使用PhotoCounter类型的属性),但是PhotoViewVC有时会被自己调用,您可以传递给这个新的PhotoViewVC self.myPhotoCounter。它只是一个指针,您正在传递给这个新的PhotoViewVC实例。但是会在内存中保留你的计数器这对10台PhotoViewVCs有效吗?他们可能都有不同的最佳答案,根据哪一个被点击回复
    - (void) viewDidLoad
    {
        [self postNotification];
        [self listenToNotifications];
    }
    
    - (void) postNotification
    {        
        NSDictionary *dataDict = [NSDictionary dictionaryWithObject:_photoObject forKey:@"photoObject"];
    
        [[NSNotificationCenter defaultCenter] postNotificationName:@"replyHappened" object:self userInfo:dataDict];
    }
    
    - (void) listenToNotifications
    {
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleReplied:) name:@"replyHappened" object:nil];
    }
    
    - (void) handleReplied:(NSNotification *) note
    {
        NSDictionary *data = [note userInfo];
    
        if (data != nil)
        {
            NSString *object = [data objectForKey:@"photoObject"];
    
            // Update counts
            int count = [_photoBestCount intValue];
    
            count = count + 1;
    
            _photoBestCount = [NSNumber numberWithInt:count];
    
            _bestsCount.text = [NSString stringWithFormat:@"%@", _photoBestCount];
        }
    }
    
    - (void) dealloc
    {
        [[NSNotificationCenter defaultCenter] removeObserver:self];
    }
    
    // Now the PhotoTakingVC delegation functions:
    
    - (void) photoTakingVCDismiss:(PostViewController *) sender
    {
        [sender dismissViewControllerAnimated:YES completion:nil];
    }
    
    - (void) photoTakingVCPresent:(PostViewController *) sender
    {
        [self dismissViewControllerAnimated:YES completion:nil];
    
        PhotoViewVC *best = [[PhotoViewVC alloc] init];
    
        best.photoData = _photoData;
        best.photoText = _photoText;
        best.photoObject = _photoObject;
        best.photoParentObject = _photoParentObject;
        best.photoUsername = _photoUsername;
        best.photoBestCount = _photoBestCount;
        best.photoReplyCount = _photoReplyCount;
        best.photoLabel = _photoLabel;
        best.photoViewerAddedBests = _photoViewerAddedBests;
    
        best.hidesBottomBarWhenPushed = YES;
    
        [self.navigationController pushViewController:best animated:NO];
    }
    
    - (void) photoView:(NSData *) photo andText:(NSString *) text andObject:(NSString *) object andParentObject:(NSString *) parentObject andUsername:(NSString *) username andBestCount:(NSNumber *) bestCount andReplyCount:(NSNumber *) replyCount andLabel:(NSMutableAttributedString *) label andAddedBests:(BOOL) addedBests
    {
        _photoData = photo;
        _photoText = text;
        _photoObject = object;
        _photoParentObject = parentObject;
        _photoUsername = username;
        _photoBestCount = bestCount;
        _photoReplyCount = replyCount;
        _photoLabel = label;
        _photoViewerAddedBests = addedBests;
    }