【问题标题】:Override Custom UITableView Class Method覆盖自定义 UITableView 类方法
【发布时间】:2015-12-10 07:56:28
【问题描述】:

我正在使用MWPhotoBrowser 在应用程序中显示一些照片,例如我想更改导航控制器的标题。使用我当前视图控制器中的值。从当前视图控制器我模态调用 MWPhotoBrowser 像这样

MWPhotoBrowser *browser = [[MWPhotoBrowser alloc] initWithDelegate:self];
//Tried this below didn't work
browser.title = @"MY NEW TITLE";
 UINavigationController *nc = [[UINavigationController alloc] initWithRootViewController:browser];
    nc.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
    [self presentViewController:nc animated:YES completion:nil];

所以我进入了这个类的实际文件,在MWPhotoBrowser.m 中有一个这样的函数

- (void)updateNavigation {
     NSUInteger numberOfPhotos = [self numberOfPhotos];
    self.title = [NSString stringWithFormat:@"%lu Photots", photosText];
}

我可以在那里手动更改它(硬编码一个值),但我希望根据我的原始视图控制器更改值,所以我想传递一个值以便能够在我的原始视图控制器上设置它.所以我尝试了这样的事情,在updateNavigation下面我放了

-(void)updateTitle:(NSString*)title {
   self.title = title;
}

然后在我原来的视图控制器中我尝试了

MWPhotoBrowser *browser = [[MWPhotoBrowser alloc] initWithDelegate:self];
[browser updateTitle:@"TEST TITLE"];

但这也不起作用,那么如何在当前视图控制器中设置MWPhotoBrowser 的标题,而不用硬编码值?

谢谢

【问题讨论】:

    标签: ios objective-c uitableview delegates uiimage


    【解决方案1】:

    updateNavigation 可以在您调用updateTitle: 方法后在任何地方调用,这就是它不起作用的原因。此外,向外部库更改/添加某些内容不是一个好主意,因为当您更新它们时,您必须记住再次应用所有更改。

    现在实现您想要的最简单的方法是创建一个简单的MWPhotoBrowser 子类,如下所示:

    CustomTitlePhotoBrowser.h

    #import <MWPhotoBrowser/MWPhotoBrowser.h> //I'm not sure if this is a correct import, change accordingly
    
    @interface CustomTitlePhotoBrowser : MWPhotoBrowser
    
    -(void)updateTitle:(NSString *)title;
    
    @end
    

    CustomTitlePhotoBrowser.m

    #import "CustomBrowser.h"
    
    @interface CustomTitlePhotoBrowser()
    
    @property(nonatomic, copy) NSString *customTitle;
    
    @end
    
    @implementation CustomTitlePhotoBrowser
    
    -(void)updateTitle:(NSString *)title {
    
        self.customTitle = title;
        [self updateNavigation];
    }
    
    -(void)updateNavigation {
        self.title = self.customTitle;
    }
    
    @end
    

    并使用它:

    CustomTitlePhotoBrowser *browser = [[CustomTitlePhotoBrowser alloc] initWithDelegate:self];
    [browser updateTitle:@"TEST TITLE"];
    

    子类中添加了两件事:

    1. 我们添加了一个存储属性customTitle,这样每当updateNavigation 被调用时,我们仍然记得我们想要显示的内容。我还决定在这里致电[self updateNavigation] - 这可能不需要,但可以让您在显示浏览器时更改标题。
    2. 我们覆盖updateNavigation - 这是所有这一切的线索。当使用CustomTitlePhotoBrowser时,每当原始代码调用updateNavigation时,我们的覆盖实现都会被调用。

    【讨论】:

      猜你喜欢
      • 2019-12-02
      • 2012-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-06
      • 2014-02-09
      • 2011-04-12
      • 2013-05-24
      相关资源
      最近更新 更多