IBOutlet не подключен в awakeFromNib - PullRequest
27 голосов
/ 02 августа 2011

Пример кода, связанный здесь, прекрасно работает и позволяет UIScrollView отображать изображения с подкачкой и предварительным просмотром изображений до и после текущего изображения:

Я пытаюсь заключить пример в один элемент управления, который можно использовать повторно.Поэтому я создал PagingScrollView:

@interface PagingScrollView : UIView {
    IBOutlet UIScrollView * scrollView;
}

@property (nonatomic,retain) IBOutlet UIScrollView * scrollView;

@end

с простой реализацией

- (void) awakeFromNib
{
    [super awakeFromNib];

    NSLog(@"awake from nib");
}

В PagingScrollView.xib я поместил View, содержащий UIScrollView и ARScrollViewEnhancer, точно так же, как в исходном xib ScrollViewPagingExampleViewController,Класс владельца его файла установлен на PagingScrollView, а выход scrollView установлен на дочерний UIScrollView.

В ScrollViewPagingExampleViewController я просто объявляю:

IBOutlet PagingScrollView   *pagingScrollView;

А в IB перетаскиваю представлениеустановите для его класса значение PagingScrollView и подключите его выход pagingScrollView к PagingScrollView.

В awakeFromNib свойство scrollView равно nil.Я думаю, что поскольку scrollView подключен в IB в том же самом nib-файле, он будет доступен к этому моменту.

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

В результате я не могу заполнить UIScrollView фактическими дочерними представлениями.Что я здесь не так делаю?

Ответы [ 4 ]

13 голосов
/ 03 августа 2011

Здесь очень хороший ответ на этот вопрос: Доступ к View в awakeFromNib?

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

5 голосов
/ 29 ноября 2017

Для тех, кто находит это и ищет соответствующий ответ в Swift 4, вы идете.

override func awakeAfter(using aDecoder: NSCoder) -> Any? {
    guard subviews.isEmpty else { return self }
    return Bundle.main.loadNibNamed("MainNavbar", owner: nil, options: nil)?.first
}

Хотя я обнаружил, что настоящий секрет заключается в том, что вы не делите подкласс главного представления a.XIB файл.Вместо этого сделайте владельца файла тем классом, который вам нужен, и добавьте Nib как внутри классов init:

let bundle: Bundle = Bundle(for: type(of: self))
let nib: UINib = UINib(nibName: "<Nib File Name>", bundle: bundle)
if let view = nib.instantiate(withOwner: self, options: nil).first as? UIView {
    view.frame = bounds
    view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    view.translatesAutoresizingMaskIntoConstraints = true
    addSubview(view)
}
2 голосов
/ 21 марта 2018

Используя Swift, вы можете использовать элемент в вашем собственном представлении после его установки:

class PointsTableViewCell: UITableViewCell {

    @IBOutlet weak var pointsTitleLabel: UILabel! {
        didSet {
            self.pointsTitleLabel.text = "Points"
        }
    }
}
2 голосов
/ 21 июня 2015

У меня была эта проблема, и, как и вы, другие статьи не применимы. У меня был ViewController, у которого был свой вид. В .xib-файле этого ViewController я поместил представление и присвоил ему класс CustomView. Это будет прекрасно работать, за исключением того факта, что CustomView был определен в своем собственном файле .xib, поэтому, естественно, в awakeFromNib все IBOutlets были равны нулю. Это связано с тем, что в конструкторе интерфейсов нет способа связать вместе файлы .xib. Поэтому, когда представление моего ViewController выводится на экран, оно пытается создать экземпляр CustomView, а не загружать файл CustomView.xib.

Здесь есть подробное описание http://cocoanuts.mobi/2014/03/26/reusable/,, но суть в том, что мне пришлось реализовать следующее в моем классе CustomView

@implementation CustomView

    - (id)awakeAfterUsingCoder:(NSCoder *)aDecoder
    {
        if (![self.subviews count])
        {
            NSBundle *mainBundle = [NSBundle mainBundle];
            NSArray *loadedViews = [mainBundle loadNibNamed:@"CustomView" owner:nil options:nil];
            return [loadedViews firstObject];
        }
        return self;
    }

@end
...