【问题标题】:Setting up a UIImageView subclass between loading from a NIB and willMoveToSuperview:在从 NIB 加载和 willMoveToSuperview 加载之间设置 UIImageView 子类:
【发布时间】:2013-05-27 23:22:00
【问题描述】:

我在视图控制器的 NIB 中放置了一个 UIImageView 子类 (AdImageView)。这个 AdImageView 知道如何使用从 willMoveToSuperview 调用的一些异步调用来启动并将远程图像加载到自身中。我知道这是可行的,因为如果我通过自己的代码添加 AdImageView 并在它被添加到超级视图之前告诉它要加载哪个图像效果很好。但是,当切换设置以使用 NIB 时,我不确定何时在 AdImageView 上设置远程路径。

我无法在任何 VC 的 init 方法中执行此操作,因为尚未设置 NIB 对象。当 VC 的 viewDidLoad 被调用时,AdImageView 的 willMoveToSuperview: 已经被调用了。我尝试设置一些 IBOutlets 告诉 AdImageView 向谁请求图片 url,但这也是在 AdImageView 的 willMoveToSuperview 之后调用的:。

我可以在 AdImageView 的 awakeFromNib 中启动远程图像加载,但我还想继续选择以编程方式将 AdImageView 添加到视图控制器。将代码放在那里会让我处于一种情况,我可以在 willMoveToSuperview 中重新调用远程图像加载:除非我用某种感觉很难看的标志来保护它。

那么,Interface Builder 对象的状态设置代码通常出现在哪里?

(对不起,这个问题没有代码,但更多的是关于策略)

【问题讨论】:

    标签: ios objective-c uiview uiviewcontroller


    【解决方案1】:

    这听起来不像是view 的工作,但你可以这样做

    @interface AdImageView : UIImageView
    
    @property (nonatomic, copy) NSString *path
    
    @end
    
    @implementation AdImageView
    
    - (void)setPath:(NSString *)path
    {
      if (_path != path) {
        _path = [path copy];
        [self loadAd];
      }
    }
    
    - (void)didMoveToSuperview
    {
      [super didMoveToSuperview];
    
      [self loadAd];
    }
    
    - (void)loadAd
    {
      // This will only load when the view is on screen
      if (self.window) {
        // ... fetch ad etc
      }
    }
    
    @end
    

    【讨论】:

    • 我同意这比我真正应该的更多地塞入 UIView 的逻辑,但我不想在每个想要有广告的视图控制器中乱扔远程请求。当我可以忍受一点黑客攻击时,将整个东西变成自己的视图控制器感觉就像一把大锤。也欢迎任何其他方法。在此期间我会试试你的代码,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-06
    相关资源
    最近更新 更多