我们可以为iPhone和iPhone使用两个单独的xib吗? iPad用于一个viewcontroller

时间:2016-07-27 07:04:22

标签: ios swift xcode ipad xib

我为iPhone和iPhone创建了两个单独的xib。 iPad兼容。从iPad xib我给viewcontroller提供参考插座。

我想要的是:我想在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!

7 个答案:

答案 0 :(得分:4)

只需创建以下结构。

  • ViewController.swift
  • ViewController.xib
  • 的ViewController〜ipad.xib

无需在运行时识别要加载的xib。

通过使用~ipad,它会自动识别。

我想要的是:我想将这些参考插座用于iPhone xib。

只需从iPad xib复制该视图控制器并将其放入iPhone xib

即可

保持“自由”的大小

enter image description here

现在,您可以调整UI组件的大小,并且所有插座都是相同的。

答案 1 :(得分:2)

只需将文件所有者从iPhone xib设置为Interface Builder中的类。然后将参考拖动到您的插座。 在运行时,您可以选择要加载的xib。

更新: Swift代码:

adb shell am start -n com.example/.MainActivity

答案 2 :(得分:0)

是的,只要您根据设备加载xib,它就可行了。

即,通过代码处理nib加载。

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)

    }
}

答案 3 :(得分:0)

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)
}

拖动iPhoneiPad .xib的插座引用。无需创建单独的IBOutlet只需创建一个并将其绑定到.xib

答案 4 :(得分:0)

我在查看加载之前实现了这些逻辑。 Swift代码在这里:

   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 })
            }

答案 5 :(得分:0)

这对我有效,在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))
    }
}

答案 6 :(得分:-2)

我认为您有以下文件...

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];
}