Ios 我们可以使用两个单独的xib';s代表iPhone&;一个可视控制器的iPad

Ios 我们可以使用两个单独的xib';s代表iPhone&;一个可视控制器的iPad,ios,swift,xcode,ipad,xib,Ios,Swift,Xcode,Ipad,Xib,我为iPhone和iPad创建了两个独立的xib。从iPad xib中,我给出了viewcontroller的参考插座 我想要的是:我想使用这些iPhone xib的参考插座 注意:我不想使用大小类 @IBOutlet weak var zoomButton: UIButton! var delegate: FlipsideViewControllerDelegate? = nil @IBOutlet var scrollView: UIScrollView! @IBOutlet var sli

我为iPhone和iPad创建了两个独立的xib。从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!

是的,只要您基于设备加载xib,这是可行的

i、 例如,通过代码处理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)

    }
}

是的,只要您基于设备加载xib,这是可行的

i、 例如,通过代码处理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)

    }
}

只需在Interface Builder中将文件所有者从iPhone xib设置为您的类。然后将引用拖动到您的出口。 在运行时,您可以选择加载哪个xib

更新: Swift代码:

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

只需在Interface Builder中将文件所有者从iPhone xib设置为您的类。然后将引用拖动到您的出口。 在运行时,您可以选择加载哪个xib

更新: Swift代码:

switch UIDevice.currentDevice().userInterfaceIdiom {
case .Phone:
    // It's an iPhone
case .Pad:
    // It's an iPad
case .Unspecified:
    // 
}
拖动
iPhone
iPad
.xib
的插座参考。无需创建单独的
IBOutlet
只需创建一个并将其绑定到两个
.xib


拖动
iPhone
iPad
.xib
的插座参考。无需创建单独的
IBOutlet
只需创建一个并将其绑定到两个
.xib
只需创建以下结构即可

  • ViewController.swift
  • ViewController.xib
  • ViewController~ipad.xib
在运行时,无需确定要加载到哪个xib

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

我想要的是:我想使用iPhone xib的参考插座。

只需从ipadxib复制视图控制器,并将其放入iphonexib即可

保持大小为“自由”


现在,您可以调整UI组件的大小,所有插座都将位于相同的位置。

只需在结构下方创建

  • ViewController.swift
  • ViewController.xib
  • ViewController~ipad.xib
无需在运行时确定要加载到哪个xib

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

我想要的是:我想使用iPhone xib的参考插座。

只需从ipadxib复制视图控制器,并将其放入iphonexib即可

保持大小为“自由”


现在,您可以调整UI组件的大小,所有插座都将处于相同的位置。

在查看加载之前,我实现了这些逻辑。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 })
            }

我在视图加载之前实现了这些逻辑。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 })
            }

我想你有以下文件

ViewController.h
ViewController.m
ViewController-iPad.xib//适用于iPad
ViewController-iPhone.xib//适用于iPhone

添加以下micro

#define IS_IPHONE   (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad ? 0 : 1)
#define LOAD_XIB(xibName) (IS_IPHONE ? [NSString stringWithFormat:@"%@-iPhone",xibName] : [NSString stringWithFormat:@"%@-iPad",xibName])
*是否为IPHONE-检查设备是否为IPHONE
*LOAD_XIB-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];
}
第二种方式-->也可以像这样加载nib

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

我想你有以下文件

ViewController.h
ViewController.m
ViewController-iPad.xib//适用于iPad
ViewController-iPhone.xib//适用于iPhone

添加以下micro

#define IS_IPHONE   (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad ? 0 : 1)
#define LOAD_XIB(xibName) (IS_IPHONE ? [NSString stringWithFormat:@"%@-iPhone",xibName] : [NSString stringWithFormat:@"%@-iPad",xibName])
*是否为IPHONE-检查设备是否为IPHONE
*LOAD_XIB-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];
}
第二种方式-->也可以像这样加载nib

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

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

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

如果您有2个XIB,则将存在两个IBOutlet连接。@ReshmiMajumder我不想为每个XIB创建单独的参考插座。有什么办法吗?如果你有2个XIB,那么你需要连接2个插座,否则使用一个故事板大小的类你可以这样做(2个XIB和一个类-假设XIB有大部分相似的项目-连接两个XIB-类中的1个插座连接两个XIB)如果(iphone){[[ClassA alloc]initWithNibName:@“ClassA~iphone”bundle:nil];}否则{[[ClassA alloc]initWithNibName:@“ClassA~iad”bundle:nil];}如果您有2个XIB,则将存在两个IBOutlet连接。@reshmiMajumber我不想为每个XIB创建单独的参考插座。有什么办法吗?如果你有2个XIB,那么你需要连接2个插座,否则使用一个故事板大小的类你可以这样做(2个XIB和一个类-假设XIB有大部分相似的项目-连接两个XIB-类中的1个插座连接两个XIB)如果(iphone){[[ClassA alloc]initWithNibName:@“ClassA~iphone”bundle:nil];}另外{[[ClassA alloc]initWithNibName:@“ClassA~iad”bundle:nil];}在问题中,您是否看到任何
objective-c
标记?抱歉,我只是提供了一些更好的东西。。。语言不重要。逻辑和流程应该很重要。在问题中,你看到任何
objective-c
标签了吗?对不起,我只是提供了一些更好的东西。。。语言不重要。逻辑和流程应该是重要的。