我正在使用Swift创建一个Universal应用程序.我使用了Storyboard和Auto-Layouts.要求是创建一个通用应用程序,它仅支持iPhone的纵向方向和仅适用于iPad的横向方向.
我已经为iPhone开发了UI,现在我将开始使用iPad UI.
此外,为iPhone创建的UI与为iPad创建的UI不同,两者的UI都非常不同.
我正在考虑为iPhone和iPad创建单独的故事板.有没有正确的方法来实现这一目标?
我已经编写了一个iPhone和iPad通用应用程序,可以在Xcode上的iPad模拟器中正常运行,但我现在想测试iPhone的功能.我似乎无法使用此代码运行iPhone模拟器,因为它始终默认为iPad?
相反,我试图在设备上运行,当它开始运行时,我收到以下错误:
dyld: Symbol not found: _OBJC_CLASS_$_UISplitViewController
Referenced from: /var/mobile/Applications/9770ACFA-0B88-41D4-AF56-77B66B324640/Test.app/Test
Expected in: /System/Library/Frameworks/UIKit.framework/UIKit in /var/mobile/Applications/9770ACFA-0B88-41D4-AF56-77B66B324640/Test.app/TEST
Run Code Online (Sandbox Code Playgroud)
由于App是以编程方式而不是使用XIB构建的,因此我使用main.m方法中的以下行拆分了2个设备逻辑:
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
{
retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate_Pad");
}
else
{
retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate_Phone");
}
Run Code Online (Sandbox Code Playgroud)
从那时起,他们使用不同的AppDelegates,我已经检查了我的标题,以确保永远不会使用UISplitView,也不会通过Phone逻辑导入.
如何避免此错误,是否有更好的方法在这个以编程方式创建的应用程序中拆分通用逻辑路径?
我试图在Tap上显示UIAlertView或者在UITextField上显示IPad和IPhone.我做了一个IBAction并用UITextField的Tap Down事件附上它.
但它不能正常工作,并不总是意味着,如果是iPhone而且不能在iPad的情况下工作
- (IBAction) TopuchState
{
//function code
}
Run Code Online (Sandbox Code Playgroud)
请帮忙我怎么能这样做.

我在AppDelegate中遇到问题,运行应用程序时出现此错误:
Terminating app due to uncaught exception 'NSUnknownKeyException', reason:
'[<UIApplication 0x856c820> setValue:forUndefinedKey:]:
this class is not key value coding-compliant for the key view.'
Run Code Online (Sandbox Code Playgroud)
这是AppDelegate.h的代码
#import <UIKit/UIKit.h>
@class ViewController;
@interface AppDelegate : UIResponder <UIApplicationDelegate>{
//UINavigationController *navigationController;
}
@property (strong, nonatomic) UIWindow *window;
@property (copy, nonatomic) ViewController * viewController;
@property (copy, nonatomic) UINavigationController * navigationController;
@end
Run Code Online (Sandbox Code Playgroud)
这是AppDelegate.m的代码
#import "AppDelegate.h"
#import "RootViewController.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: (NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
RootViewController *rootMenu;
if ([[UIDevice currentDevice] …Run Code Online (Sandbox Code Playgroud) 我正在从硬编码布局转移到Xcode 6中可用的新通用故事板系统.能够创建一个故事板,通过自动布局的魔力,可以在iPhone和iPhone上运行,这很棒. iPad.我的理解是,通用故事板与iOS 7向后兼容.
但是,我遇到了使用popover segues的问题.在iOS 8上,新的"Present as Popover"segue将在iPad界面上显示为弹出式窗口,并在iPhone界面上显示为模态视图控制器.这正是我想要的行为,但是当我在iOS 7上运行我的通用故事板时,每当我尝试使用popover segue时,应用程序都会崩溃.这是我收到的错误消息:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason:
'-[UIPopoverController initWithContentViewController:] called when not
running under UIUserInterfaceIdiomPad.'
Run Code Online (Sandbox Code Playgroud)
这有点烦人,因为我不想为每个UI成语使用单独的故事板.
看起来这些是我的选择:
UIStoryboardSegue,它将在iPad上显示弹出窗口并在iPhone上显示模态视图.这需要手动更改我的应用程序中所有popover segues的类.这些都不是很好的选择,所以我想知道:我还有其他选择吗?我错过了我提出的解决方案的任何问题吗?
我在Xcode 5中创建了一个项目."部署信息"设置显示设备:通用,但具有单独的iPhone和iPad设置以及相应的iPhone和iPad故事板.
现在我正在Xcode 6中开发相同的项目,我想使用一个通用故事板而不是两个故事板.我只是在iPhone故事板上工作,并没有触及iPad.是否有可能放弃iPad故事板并将现有的iPhone故事板转换为我的主要通用故事板?
在一个通用项目中尝试我,我想从故事板中加载一个vc标识符.有没有办法避免在访问故事板时明确检查成语.
这个丑陋的代码有效....
UIStoryboard *storyboard;
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPad" bundle:nil];
}
else {
storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil];
}
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"MyViewController"];
Run Code Online (Sandbox Code Playgroud)
但是你好.字符串文字主要故事板很难看(不知道为什么项目不能保存主故事板设置,以便应用程序可以说[UIStoryboard mainStoryboard];)但显式的成语检查是一个过头的桥梁.
是否有任何隐藏的智能(可与支持视网膜显示的"@ 2x"图像后缀相比)清除此代码?
在iOS开发的旧XIB世界中,我能够创建一个View Controller和一个XIB,并将它们用于iPhone和iPad环境.只需进行一些代码调整,XIB就会调整大小并进行调整以适应不同的尺寸和宽高比.这使我可以降低两种布局随时间不同步的风险.
在故事板的世界中,同样的事情是可能的吗?默认情况下,Xcode为我的Universal应用程序创建了两个不同的故事板 - 一个用于iPhone,另一个用于iPad.
如何为两者使用一个故事板?
谢谢!
更新:
Xcode 6中的大小类基本上可以实现Universal Storyboards的目标.更多信息:
在Xcode中创建故事板文件时,您必须选择是否适用于iPhone或iPad.这意味着应始终将iPhone和iPad UI放入单独的故事板中.这是真的?
我的应用程序有多个故事板.虽然Main.storyboard文件在iPhone和iPad之间存在很大差异,但其他故事板几乎完全相同.唯一的区别可能是推动iPhone与iPhone上的popover,可以通过编程方式处理.制作两个故事板似乎非常愚蠢和多余.
因此,如果制作一个"通用"故事板,是否应该在Xcode中选择iPhone或iPad?有关系吗?
在采用新的时候,UISplitViewController我试图将更改作为使用UISplitViewControllerDisplayModeAutomatic模式时发生的默认行为.
在纵向工作时,我希望在用户触发推送到细节侧时隐藏主要叠加层.默认情况下,覆盖图保持在屏幕上,直到用户点击细节一侧.
我已尝试将以下内容与委托人一起使用:
- (BOOL)splitViewController:(UISplitViewController *)splitViewController showDetailViewController:(UIViewController *)vc sender:(id)sender
{
if (splitViewController.displayMode == UISplitViewControllerDisplayModePrimaryOverlay) {
[UIView animateWithDuration:0.3 animations:^{
splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModePrimaryHidden;
}];
}
return NO;
}
Run Code Online (Sandbox Code Playgroud)
这给了我在肖像中所需的行为,但这打破了横向模式(我想表现得像UISplitViewControllerDisplayModeAllVisible).如果您已完成推动然后旋转设备,则左侧仍然是隐藏的(如预期的那样).我无法找到一个appriprite地方来重新设置旋转的首选模式以显示左侧(因为特征集合不能用于告诉iPad上的风景与肖像).
如何手动触发覆盖的解雇?
Dupe注意: iOS8已经UISplitViewController完全改变了,所以在2014年 6月之前所有其他的SO答案都可能是错误的(我已经挖掘了很多,只是因为)
uisplitviewcontroller screen-rotation ios ios-universal-app ios8
ios ×9
ipad ×6
iphone ×4
storyboard ×3
uistoryboard ×2
appdelegate ×1
ios8 ×1
objective-c ×1
swift ×1
xcode ×1
xcode5 ×1
xcode6 ×1