Можем ли мы использовать два отдельных xib для iPhone и iPad для одного контроллера просмотра?

Я создал два отдельных xib для iPhone и iPad. С iPad xib я дал ссылку на контроллер просмотра.

Что я хочу, так это: я хочу использовать эти эталонные розетки для iPhone xib.

Примечание. Я не хочу использовать классы размеров.

@IBOutlet weak var zoomButton: UIButton!
var delegate: FlipsideViewControllerDelegate? = nil
@IBOutlet var scrollView: UIScrollView!
@IBOutlet var sliderPlotStrip: F3PlotStrip!
@IBOutlet var scrollView2: UIScrollView!
@IBOutlet var sliderPlotStrip2: F3PlotStrip!

@IBOutlet var detailsButton: UIButton!
@IBOutlet var analyzeButton: UIBarButtonItem!

person Srikanth Adavalli    schedule 27.07.2016    source источник
comment
Если у вас есть 2 XIB, то будут присутствовать два соединения IBOutlet.   -  person Reshmi Majumder    schedule 27.07.2016
comment
@ReshmiMajumder Я не хочу создавать отдельные эталонные точки для каждого xib. Там в любом случае ?   -  person Srikanth Adavalli    schedule 27.07.2016
comment
Если у вас есть 2 XIB, вам нужно соединить 2 выхода, иначе с одной раскадровкой используйте классы размера   -  person Reshmi Majumder    schedule 27.07.2016
comment
Вы можете сделать что-то вроде этого (2 XIB с одним классом - при условии, что XIB имеют в основном похожие элементы - дважды подключены к обоим XIB - 1 выход в классе подключен к обоим XIB) if (iphone) { [[ClassA alloc] initWithNibName:@ClassA~ пакет iphone: ноль]; } else { [[ClassA alloc] initWithNibName:@ClassA~iad bundle:nil]; }   -  person RJE    schedule 27.07.2016


Ответы (7)


Просто создайте структуру ниже.

  • ViewController.swift
  • ViewController.xib
  • ViewController~ipad.xib

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

Используя ~ipad, он распознает его автоматически.

Что я хочу, так это то, что я хочу использовать эти эталонные розетки для iPhone xib.

Просто скопируйте этот контроллер представления с iPad xib и поместите его в iPhone xib.

Сохранить размер до «Свободы»

введите описание изображения здесь

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

person Hasya    schedule 27.07.2016

Просто установите владельца файла с iPhone xib на свой класс в Interface Builder. Затем перетащите ссылку на ваш выход. Во время выполнения вы можете выбрать, какой xib загружать.

ОБНОВЛЕНО: Быстрый код:

switch UIDevice.currentDevice().userInterfaceIdiom {
case .Phone:
    // It's an iPhone
case .Pad:
    // It's an iPad
case .Unspecified:
    // 
}
person jenthone    schedule 27.07.2016

if UIDevice.currentDevice().userInterfaceIdiom() == .Phone {
    // If iPhone 5 or new iPod Touch
    if UIScreen.mainScreen().bounds.size.height == 568 {
        var myViewController: UIViewController = UIViewController(nibName: "ViewControllerExt", bundle: nil)
    } else {
        // Regular iPhone
        var myViewController: UIViewController = UIViewController(nibName: "ViewController", bundle: nil)
    }
    // If iPad
}
else {
    var myViewController: UIViewController = UIViewController(nibName: "ViewControllerPad", bundle: nil)
}

Перетащите ссылки на вашу торговую точку на iPhone или iPad .xib. Не нужно создавать отдельные IBOutlet, просто создайте один и привяжите его к обоим .xib

person Himanshu padia    schedule 27.07.2016

Я реализовал эту логику перед загрузкой просмотра. Свифт-код здесь:

   if UIDevice.currentDevice().userInterfaceIdiom == UIUserInterfaceIdiom.Phone {
                let controller = FlipsideViewController(nibName: "FlipsideViewController_iPhone", bundle: nil)
     self.presentViewController(controller, animated: true, completion: { _ in })
            }
            else
            {
                let controller = FlipsideViewController(nibName: "FlipsideViewController", bundle: nil)
     self.presentViewController(controller, animated: true, completion: { _ in })
            }
person Srikanth Adavalli    schedule 27.07.2016

Да, это выполнимо, если вы загружаете xib на основе устройства.

т. е. обрабатывать загрузку пера с помощью кода.

Решение в Swift:

class ViewController: UIViewController {

    @IBOutlet weak var deviceLabel : UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        loadFromNib()
    }

    func loadFromNib() {

        //Detecting Xib name by device model
        let nib = (UIDevice.currentDevice().model == "iPad") ? "iPad" : "iPhone"

        //Loading the nib
        let v: UIView = UINib(nibName: nib, bundle: nil).instantiateWithOwner(self, options: nil)[0] as! UIView

        //Adding the loaded nib to viewcontroller's subview
        view.addSubview(v)

    }
}
person Tesan3089    schedule 27.07.2016

Это сработало для меня на Xcode 10, iOS 12, Swift 4:

override func loadView() {
    super.loadView()
    if UIDevice.current.userInterfaceIdiom == .phone {
        Bundle.main.loadNibNamed("DetailsViewController", owner: self, options: nil)
    } else {
        guard let iPadXib = Bundle.main.loadNibNamed("DetailsViewController~iPad", owner: self, options: nil) else { return }
        self.view.addSubview((iPadXib[0] as! UIView))
    }
}
person Joe M    schedule 26.09.2018

Я предполагаю, что у вас есть следующие файлы...

ViewController.h ViewController.m ViewController-iPad.xib // For iPad ViewController-iPhone.xib // For iPhone

Добавить следующий микро

#define IS_IPHONE   (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad ? 0 : 1)
#define LOAD_XIB(xibName) (IS_IPHONE ? [NSString stringWithFormat:@"%@-iPhone",xibName] : [NSString stringWithFormat:@"%@-iPad",xibName])

*IS_IPHONE - Check if device is iPhone or not *LOAD_XIB - this micro use for load xib

Первый способ --> вы можете использовать LOAD_XIB() micro вот так...

[[[NSBundle mainBundle]loadNibNamed:Load_Xib(@"ViewController") owner:self options:nil] objectAtIndex:0];

Второй способ --> вы также можете загрузить перо вот так...

if(IS_IPHONE)
{
   [[[NSBundle mainBundle]loadNibNamed:@"ViewController-iPhone" owner:self options:nil] objectAtIndex:0];
}
else
{
   [[[NSBundle mainBundle]loadNibNamed:@"ViewController-iPad" owner:self options:nil] objectAtIndex:0];
}
person Goyani Maulik    schedule 25.09.2018
comment
В вопросе вы видите тег objective-c? - person Kamran; 25.09.2018
comment
Извините, но я просто предлагаю кое-что получше... язык не имеет значения. логика и поток должны иметь значение. - person Goyani Maulik; 25.09.2018