2016-02-25 3 views
0

Я пытаюсь загрузить простой пользовательский xib для UIToolbar с помощью единственной метки, чтобы заставить все работать, а мой метод init?(coder aDecoder: NSCoder) терпит неудачу, пытаясь изменить текст метки, поскольку это еще не создан.UINavigationController в раскадровке с пользовательским UIToolbar xib не работает

fatal error: unexpectedly found nil while unwrapping an Optional value

Я использую UIView вместо UIToolbar здесь, потому что легче работать, и это может быть проблемой. Если я использую UIToolbar в моем документе xib, он заставляет все, что я помещаю на UIToolbar, быть UIBarButtonItem, а неудачный размер-эффект - это нежелательное дополнение, которое это создает. Обратите внимание на красный бар оттенок, который можно увидеть при добавлении UIViews к UIToolbar в изображении здесь (смотрите на то, как некрасиво красный есть!):

UIToolbar with red bar tint

Я считаю, что я установил все необходимые настройки и IBOutlets в панели Inspector Xcode. И с простыми центрированными ограничениями макета x, y.

Update 1:

Если добавить UIView к UIToolbar, я застрял с видом иерархии UIToolbar> UIBarButtonItem> UIView. При выборе UIView и чтение Размер инспектора на правой панели Xcode, вы увидите нечто похожее на следующее:

enter image description here

Это несчастный побочный эффект нерабочем множества точек (16 к слева от UIView и 6 сверху). Хотя, с достаточно большим UIView, 6 очков сверху можно восстановить, но 16 влево не могут. Опять же, обратите внимание на красный край в верхнем изображении.

Update 2:

Любое UIView смещение 16 пунктов теперь установлен с моим новым решением ниже.

ответ

4

Я нашел вашу проблему.

Ваши проблемы, Вы взяли UIView в .XIB вместо UIToolbar.

см. Ниже Шаги.

1) Вы должны удалить UIView из XIB файла. и Добавить UIToolbar вместо UIVIew.

enter image description here

2) Присвоить Идентичность в XIb CustomToolbar.swift

enter image description here

3) Теперь установите IBOutlet пункту в вашем CustomToolbar.скор

enter image description here

4) В вашей Viewdidload поместить ниже код,

let toolBar = UINib(nibName: "CustomToolbar", bundle: nil).instantiateWithOwner(nil, options: nil).first as! CustomToolbar 

     self.navigationController!.view.addSubview(toolBar) 
     self.navigationController!.toolbarItems = toolBar.items 

5) В ваших всех viewcontrollers viewdidload добавить

self.toolbarItems = self.navigationController!.toolbarItems 

Edit: - Вы можете добавить UIView в UIToolbar И добавьте controll в соответствии с вашим Требованием.

enter image description here

Я надеюсь, что эта информация будет полезной для вас.

+0

привет, спасибо за ваш ответ. Я понимаю, что мой UIView - очень хорошая проблема №1. Мне не интересно добавлять кнопки в UIToolbar, но я хочу настроить панель инструментов так, как хотелось бы любой другой UIView ... –

+0

В моем вопросе вы можете увидеть, что я уже пытался добавить UIToolbar в свой xib, но у него есть сторона эффекты наличия прокладки вокруг кнопки. Я хочу, чтобы представление инкапсулировало все пространство. –

+0

проверить Отредактированный ответ. –

2

Ваш xib ссылка отсутствует. Вот почему вы получили фатальную ошибку.

В процессе отладки вы получите «UILabel» - это нуль.

Без использования .xib вы можете использовать мой следующий код.

import Foundation 
    import UIKit 

    class CustomToolbar: UIToolbar { 
     var label: UILabel! 

     required convenience init(coder aDecoder: NSCoder) { 
      self.init(aDecoder) 
      self.initialize() 
     } 

     init(_ coder: NSCoder? = nil) { 
      if let coder = coder { 
       super.init(coder: coder)! 
      } 
      else { 
       super.init(frame: CGRectZero) 
      } 
     } 

     // Initial the toolbar based on the frame. 
     override init(frame:CGRect) { 
      super.init(frame:frame) 
      self.initialize() 
     } 

     // Initialize the label. 
     func initialize() { 
      self.label = UILabel.init(); 
      self.label.textColor = UIColor.redColor(); 
      self.label.font = UIFont.systemFontOfSize(18); 
      self.label.frame = CGRectMake(0, 0, UIScreen.mainScreen().bounds.width, 21); 
      self.addSubview(self.label); 
      label.text = "Some text assigned programmatically" // Success 
     } 
    } 
+0

Спасибо, да. Без xib ваш код работает! Но я действительно хотел использовать xib. –

0

@BadalShah является правильным, хотя его реализация обработки добавления подвид либо в UINavigationController подкласса или UIViewController не совсем желательно - оно должно быть обработано в классе CustomToolbar, как описано здесь.

@ VigneshKumar почти правильно! Мне нужно было загрузить nib внутри моего класса CustomToolbar. Раньше я применял имя класса CustomToolbar к UIView, который был неправильным. Мне нужно было назначить его только владельцу файла. Предоставление xib другого имени файла из имени моего пользовательского класса также помогло мне в том, что я стал менее смущен тем, какое представление нужно для присвоения имени класса.

let nibName = "MyView" 

func setup() { 
    view = loadViewFromNib() 
    view.frame = bounds 
    view.autoresizingMask = [.FlexibleWidth, .FlexibleHeight] 
    addSubview(view) 
} 

func loadViewFromNib() -> UIView { 
    let bundle = NSBundle(forClass: self.dynamicType) 
    let nib = UINib(nibName: nibName, bundle: bundle) 
    let view = nib.instantiateWithOwner(self, options: nil).first as! UIView 
    return view 
} 

override init(frame: CGRect) { 
    super.init(frame: frame) 
    setup() 
} 

required init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 
    setup() 

    // label should already be initialized. Let's try changing the text! 
    label.text = "Some new data!" // Works! 
} 
Смежные вопросы