Как загрузить UIView использование файла пера, созданного с Интерфейсным Разработчиком

Для полученной ошибки это означает, что публичный IP не может быть найден в resourcegroup1 с тем же регионом, что и AKS. Другой регион вызывает ошибку, подобную вашей:

enter image description here

Таким образом, вы должны создать публичный IP в том же регионе с вашим AKS. Тогда это будет работать для вас.

239
задан Alexander Farber 27 March 2014 в 02:26
поделиться

6 ответов

Всем спасибо. Я нашел способ сделать то, что хотел.

  1. Создайте свой UIView с помощью IBOutlet , которые вам нужны.
  2. Создайте xib в IB, спроектируйте его по своему вкусу и свяжите его следующим образом: Владелец файла относится к классу UIViewController (нет настраиваемого подкласса, но есть «настоящий»). Представление владельца файла связано с основным представлением, и его класс объявлен как один из шага 1).
  3. Подключите элементы управления к IBOutlet s.
  4. DynamicViewController ] может запустить свою логику, чтобы решить, какое представление / xib загружать. После принятия решения в методе loadView введите что-то вроде этого:

     NSArray * nibViews = [[NSBundle mainBundle] loadNibNamed: @ "QPickOneView"
     Владелец: самостоятельно
     Варианты: ноль];
    
    QPickOneView * myView = [nibViews objectAtIndex: 1];
    
    myView.question = вопрос;
    

Вот и все!

Метод основного пакета loadNibNamed позаботится об инициализации представления и создании соединений.

Теперь ViewController может отображать представление или другое в зависимости от данных в памяти , и "родительскому" экрану не нужно беспокоиться об этой логике.

120
ответ дан 23 November 2019 в 03:19
поделиться

Вы не должны устанавливать класс вашего контроллера представления как подкласс UIView в Интерфейсном Разработчике. Это определенно, по крайней мере, часть вашей проблемы. Оставьте это либо UIViewController , либо его подкласс, либо какой-либо другой собственный класс, который у вас есть.

Что касается загрузки только представления из xib, я предполагал, что вы использовали , чтобы иметь какой-то контроллер представления (даже если он не расширяет UIViewController , который может быть слишком тяжелым для ваших нужд), установленным в качестве владельца файла в Interface Builder, если вы хотите использовать его для определения ваш интерфейс. Я провел небольшое исследование, чтобы подтвердить это. Это связано с тем, что в противном случае не было бы возможности получить доступ ни к одному из элементов интерфейса в UIView , и не было бы способа, чтобы ваши собственные методы в коде запускались событиями.

Если вы используете UIViewController в качестве владельца вашего файла для ваших представлений, вы можете просто использовать initWithNibName: bundle : , чтобы загрузить его и вернуть объект контроллера представления. В IB убедитесь, что вы установили выход view на представление с вашим интерфейсом в xib. Если вы используете какой-либо другой тип объекта в качестве владельца вашего файла, вам нужно будет использовать метод NSBundle loadNibNamed: owner: options: для загрузки пера, передавая экземпляр Владелец файла метода. Все его свойства будут правильно настроены в соответствии с выходами, которые вы определите в IB.

s Владелец ваших представлений, вы можете просто использовать initWithNibName: bundle: , чтобы загрузить его и получить обратно объект контроллера представления. В IB убедитесь, что вы установили выход view на представление с вашим интерфейсом в xib. Если вы используете какой-либо другой тип объекта в качестве владельца вашего файла, вам нужно будет использовать метод NSBundle loadNibNamed: owner: options: для загрузки пера, передавая экземпляр Владелец файла метода. Все его свойства будут правильно настроены в соответствии с выходами, которые вы определите в IB.

s Владелец ваших представлений, вы можете просто использовать initWithNibName: bundle: , чтобы загрузить его и получить обратно объект контроллера представления. В IB убедитесь, что вы установили выход view на представление с вашим интерфейсом в xib. Если вы используете какой-либо другой тип объекта в качестве владельца вашего файла, вам нужно будет использовать метод NSBundle loadNibNamed: owner: options: для загрузки пера, передавая экземпляр Владелец файла метода. Все его свойства будут правильно настроены в соответствии с выходами, которые вы определите в IB.

Если вы используете какой-либо другой тип объекта в качестве владельца вашего файла, вам нужно будет использовать метод NSBundle loadNibNamed: owner: options: для загрузки пера, передавая экземпляр Владелец файла метода. Все его свойства будут правильно настроены в соответствии с выходами, которые вы определите в IB.

Если вы используете какой-либо другой тип объекта в качестве владельца вашего файла, вам нужно будет использовать метод NSBundle loadNibNamed: owner: options: для загрузки пера, передавая экземпляр Владелец файла метода. Все его свойства будут правильно настроены в соответствии с выходами, которые вы определите в IB.

11
ответ дан 23 November 2019 в 03:19
поделиться

В предыдущем ответе не учитывались изменения в структуре NIB (XIB), произошедшие между версиями 2.0 и 2.1 iPhone SDK. Пользовательское содержимое теперь начинается с индекса 0 вместо 1.

Вы можете использовать макрос 2.1, который действителен для всех версий 2.1 и выше (это два символа подчеркивания перед IPHONE:

 // Cited from previous example
 NSArray* nibViews =  [[NSBundle mainBundle] loadNibNamed:@"QPickOneView" owner:self options:nil];
 int startIndex;
 #ifdef __IPHONE_2_1
 startIndex = 0;
 #else
 startIndex = 1;
 #endif
 QPickOneView* myView = [ nibViews objectAtIndex: startIndex];
 myView.question = question;

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

Барни

3
ответ дан 23 November 2019 в 03:19
поделиться

Я нашел эту запись в блоге Аарона Хиллегасса (автора, инструктора, ниндзя Cocoa) очень познавательной. Даже если вы не примете его модифицированный подход к загрузке файлов NIB через назначенный инициализатор, вы, вероятно, по крайней мере, получите лучшее понимание происходящего процесса. В последнее время я использую этот метод с большим успехом!

4
ответ дан 23 November 2019 в 03:19
поделиться

Я тоже хотел сделать что-то подобное, вот что я нашел: (SDK 3.1.3)

У меня есть контроллер представления A (сам принадлежит контроллеру Nav), который загружает VC B на нажатие кнопки:

В AViewController.m

BViewController *bController = [[BViewController alloc] initWithNibName:@"Bnib" bundle:nil];
[self.navigationController pushViewController:bController animated:YES];
[bController release];

Теперь VC B имеет свой интерфейс из Bnib, но при нажатии кнопки я хочу перейти в «режим редактирования», который имеет отдельный пользовательский интерфейс от другого пера, но мне не нужен новый VC для режима редактирования, я хочу, чтобы новый наконечник был связан с моим существующим B VC.

Итак, в BViewController.m (в методе нажатия кнопки)

NSArray *nibObjects = [[NSBundle mainBundle] loadNibNamed:@"EditMode" owner:self options:nil];
UIView *theEditView = [nibObjects objectAtIndex:0];
self.editView = theEditView;
[self.view addSubview:theEditView];

Затем нажмите другую кнопку (для выхода из режима редактирования):

[editView removeFromSuperview];

и я вернусь к своему исходному Bnib.

Это работает нормально, но обратите внимание, что в моем EditMode.nib есть только один объект верхнего уровня, объект UIView. Не имеет значения, установлен ли в этом пере Владелец файла как BViewController или по умолчанию NSObject, НО убедитесь, что для View Outlet у владельца файла НЕ установлено какое-либо значение. Если это так, я получаю сбой exc_bad_access, и xcode продолжает загружать 6677 кадров стека , показывая внутренний UIView метод многократно вызывается ... так что выглядит как бесконечный цикл. (Однако View Outlet установлен в моем исходном Bnib)

Надеюсь, это поможет.

6
ответ дан 23 November 2019 в 03:19
поделиться

Я не уверен, о чем говорят некоторые ответы, но мне нужно поместить этот ответ здесь для следующего поиска в Google. Ключевые слова: "Как загрузить UIView из nib" или "Как загрузить UIView из NSBundle. "

Вот код почти на 100% прямо из книги Apress Beginning iPhone 3 (страница 247, "Using The New Table View Cell"):

- (void)viewDidLoad {
    [super viewDidLoad];
    NSArray *bundle = [[NSBundle mainBundle] loadNibNamed:@"Blah"
                                                 owner:self options:nil];
    Blah *blah;
    for (id object in bundle) {
        if ([object isKindOfClass:[Blah class]]) {
            blah = (Blah *)object;
            break;
        }
    }   
    assert(blah != nil && "blah can't be nil");
    [self.view addSubview: blah];
} 

Это предполагает, что у вас есть подкласс UIView под названием Blah, перо под названием Blah, которое содержит UIView, класс которого установлен на Blah.


Категория: NSObject+LoadFromNib

#import "NSObject+LoadFromNib.h"

@implementation NSObject (LoadFromNib)

+ (id)loadFromNib:(NSString *)name classToLoad:(Class)classToLoad {
    NSArray *bundle = [[NSBundle mainBundle] loadNibNamed:name owner:self options:nil];
    for (id object in bundle) {
        if ([object isKindOfClass:classToLoad]) {
            return object;
        }
    }
    return nil;
}

@end

Swift Extension

extension UIView {
    class func loadFromNib<T>(withName nibName: String) -> T? {
        let nib  = UINib.init(nibName: nibName, bundle: nil)
        let nibObjects = nib.instantiate(withOwner: nil, options: nil)
        for object in nibObjects {
            if let result = object as? T {
                return result
            }
        }
        return nil
    }
}

И пример использования:

class SomeView: UIView {
    class func loadFromNib() -> SomeView? {
        return self.loadFromNib(withName: "SomeView")
    }
}
69
ответ дан 23 November 2019 в 03:19
поделиться