已经在线阅读了一些关于xcode 4.2新故事板功能的精彩教程.我似乎无法找到有条件故事板的信息.例如,制作一个故事板,其中一个按钮可以根据布尔变量的值将您带到不同的屏幕.
我有一个这样的故事板:
-- initial --> [PictureListViewController] ----> [PictureDetailViewController]
Run Code Online (Sandbox Code Playgroud)
现在我想设置我的ViewController的委托PictureListViewController.因为它是第一个ViewController,所以我不能在方法中执行此操作,-(void)prepareForSegue:...因为我最初的ViewController是由Storyboard框架创建的.
为了重新使用,我也不希望PictureListViewController如此设置它自己delegate.
这是什么最好的做法.我当然可以创建另一个"空"ViewController,然后将其转移到PictureListViewController但是这对我来说感觉不对.
非常欢迎您的帮助.谢谢 :-)
我有一个简单的UIViewTable,在故事板中使用UINavigationController push segue实现了深入细节.它不时发生,表视图控制器似乎被解除分配,而我在详细视图中,因此我得到了着名的:
[MyViewController controllerWillChangeContent:]: message sent to deallocated instance
Run Code Online (Sandbox Code Playgroud)
我解释得更好,我有一个NSOperation队列,它异步加载我的数据,并在它刚刚完成时填充表.正确检索数据并填充表格.对于详细视图,我在prepareForSegue方法中单击一个单元格并将NSManagedObjectID传递给目标控制器.当我对详细信息视图进行更改时,非常随机,取出的控制器松开其委托,或者看起来,作为控制器的委托本身被取消分配.导致崩溃.
获取的结果控制器声明为属性:
@property(nonatomic,strong) NSFetchedResultsController *fetchedResultsController;
Run Code Online (Sandbox Code Playgroud)
然后这就是从viewDidLoad开始一切正常工作的方式.
- (void)viewDidLoad {
[super viewDidLoad];
[self loadDataAsynchronously];
}
-(void)loadDataAsynchronously {
NSOperationQueue *queue = [NSOperationQueue new];
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self
selector:@selector(loadData)
object:nil];
[queue addOperation:operation];
}
-(void)loadData {
NSFetchRequest *findAllEntities = [[NSFetchRequest alloc] init];
[findAllEntities setEntity:ENTITY_DESC];
NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"created" ascending:YES];
[findAllEntities setSortDescriptors:[NSArray arrayWithObject:sort]];
[findAllEntities setFetchBatchSize:20];
[NSFetchedResultsController deleteCacheWithName:@"MyCache"];
if(self.fetchedResultsController==nil) {
self.fetchedResultsController = [[NSFetchedResultsController alloc]
initWithFetchRequest:findAllPlants
managedObjectContext:MOC
sectionNameKeyPath:nil
cacheName:@"MyCache"];
self.fetchedResultsController.delegate=self;
}
NSError *error=nil; …Run Code Online (Sandbox Code Playgroud) memory-leaks objective-c nsfetchedresultscontroller ios5 uistoryboard
我有一个应用程序,想要在应用程序处于非活动状态一段时间后注销用户.这是应用程序中的多个不同视图,我希望应用程序委托在此方法触发时将loginview设置为当前视图:
- (void)applicationDidBecomeActive:(UIApplication *)application
Run Code Online (Sandbox Code Playgroud)
如何在此方法中手动将loginViewController设置为故事板中的当前显示视图?
我知道这个话题很热门,对此有很多讨论,但是,即使最低部署目标是iOS5,我们仍会在应用程序中使用xib(很快就会降级到iOS6)。我们已经浏览并阅读了很多有关情节提要的文章,看来苹果公司正在将这种方法作为制作UI东西的首选方法,但是我们看不到使用这种“玩具”工具的真正好处。对于相对较小的一个开发人员项目应用程序,情节提要板可能比较方便,但是,在多个大型开发项目中并没有真正的好处,因为合并git / svn情节提要之间的冲突令人不胜其烦,因此,必须将stoyboard分成模块,甚至可能只包含一个屏幕,因此在这种情况下,它与Xib方法非常相似。同样,中型和大型应用程序的导航顺序有些复杂。
到目前为止,我仅看到一个好处-在一个地方可视化屏幕和导航。是的,在使用Xibs时我们没有这样的导航流程,但是,您可以使用任何UML建模工具(例如,Astah社区免费版本工具)来为此绘制UML屏幕导航计划图,仅此而已。所有的UI都可以方便地分解为Xibs,并且很容易直接从代码中加载和添加它们。即使我们开始开发相对较小的应用程序,它的大小也会(以后)会增加,因此在开始时使用灵活的Xibs会在以后阻止您采取其他解决方法。
因此,这些是我的想法和观察,我想听听开发人员开发的其他应用程序的其他意见,这些应用程序具有故事板,并且看到了哪些专业人士。我最大的担心是苹果将弃用Xibs,因为我们正在启动一个可能持续2年甚至更多年的新大型项目,因此即使使用方便且首选的UI方式,也不愿使用在不久的将来将弃用的方法。东西。
我正在开发一个storyBoard加载系统,我需要检查特定storyBoard的存在.
我做了一个函数检查它(给定一个特定的StoryBoard名称):
(NSString *)ressourceNameForDevice:(NSString *)rootName extension:(NSString *)ext
{
NSString *retString = rootName;
NSString *iPadString = [NSString stringWithFormat:@"%@-iPad", rootName];
NSString *iPhoneWideString = [NSString stringWithFormat:@"%@-wide", rootName];
if (IS_IPAD &&
(nil != [[NSBundle mainBundle] pathForResource:iPadString ofType:ext]))
{
retString = iPadString;
}
if (IS_IPHONE_WIDE &&
(nil != [[NSBundle mainBundle] pathForResource:iPhoneWideString ofType:ext]))
{
retString = iPhoneWideString;
}
return retString;
}
Run Code Online (Sandbox Code Playgroud)
我用@"storyboard"扩展参数调用这个函数.
我probleme是函数调用失败上nil != [[NSBundle mainBundle] pathForResource:iPhoneWideString ofType:ext],尽管故事板IS目前在我的项目和捆绑,它不会发现.我想我应该给它另一个扩展,我也试过@"nib"但没有更多的结果.
谁知道怎么检查?
在Xcode 5.0.2中,我试图重新创建Michael Lehman的"Collection View"示例,用于他的视频教程学习为iPhone和iPad构建应用程序(在Safari上保护密码;第5章).
Michael使用以下代码从nib文件加载Collection View Cell(这里是他的ExploreUICollectionView/ViewController.m的完整版本):
- (void)viewDidLoad
{
[super viewDidLoad];
self.myCollectionView.delegate = self;
self.myCollectionView.dataSource = self;
self.cellData = [[NSMutableArray alloc]init];
for(int i=0; i < 100; i++)
{
[self.cellData addObject:[NSString stringWithFormat:@"#%d", i+1]];
}
UINib *cellNib = [UINib nibWithNibName:@"CVCell"
bundle:nil];
[self.myCollectionView registerNib:cellNib
forCellWithReuseIdentifier:@"CVCell"];
}
Run Code Online (Sandbox Code Playgroud)
但是我想不为单元格创建单独的nib文件,而是将View拖到Main_iphone.stroryboard和Main_ipad.storyboard,如果需要,给它一个"Storyboard ID"然后(不知何故)使用它myCollectionView.
我的问题是我应该打电话给哪些方法呢?
我不能使用nibWithNibName,并registerNib:forCellWithReuseIdentifier在这里.
更新: rdelmar的建议有效(谢谢!):

我总是在代码中完成我的UI,但已经决定我应该为当前项目使用故事板和自动布局.一切都进展顺利,直到我构建了一个复杂的场景,其中包含大约50个具有大量层次结构和一些视图网格的视图.
问题是我的自动布局在某些设备和方向上变得混乱.我发现使用IB尝试修复数十(数百?)个约束或追踪问题并解决问题具有挑战性.情况是这样的,我没有得到错误或警告,有时只是一些不愉快的布局.对于追踪约束信息,您需要做的所有点击和更改设置都会让您感到痛苦,更不用说了解它们在场景中的相关性.
我花了一天时间阅读有关自动布局和约束的文档和背景材料,看来我最好的解决方案是使用可视化格式在代码中指定约束并创建一些自定义代码来帮助.但是,我似乎无法找到有关如何从IB转换为代码的任何内容.
具体来说,我应该擦除所有IB约束并手动完成它们还是可以选择性?我问,因为我在包含内容视图具有完美布局的视图中有一些视图组.
其次,我最好把代码放在哪里?我想共存故事板,只想有选择地修改一些复杂的场景.是视图控制器的viewWillAppear:修改或删除/添加它控制的视图的约束的正确位置?
按说我有一个的UIViewController一个和UIViewController中乙.从A,我调用方法presentViewController:B.当B出现时,A会发生什么?它是从内存中删除的吗?如果没有,我应该用什么方法来删除它?
如果我的UI流程是这样的,A-> B-> A-> B-> A-> B-> ...依此类推,如何防止内存相应增加?
我在故事板中使用自动布局和大小类,并且有一个对视图控制器底部有垂直约束的按钮.但是,当我在我的iPhone6 Plus上以缩放模式运行我的应用程序时,(Settings -> Display & Brightness -> Display Zoom -> Zoomed)该按钮不会重新定位.
这是一个错误吗?如果是这样,什么是最好的解决方法,我可以找出应用程序是否处于缩放模式并相应地更改约束?
或者我在这里做错了什么?
uistoryboard ×10
ios ×9
objective-c ×3
xcode ×3
autolayout ×2
ios5 ×2
cocoa-touch ×1
conditional ×1
ipad ×1
iphone-6 ×1
memory-leaks ×1
storyboard ×1
uiview ×1
xcode5 ×1
xib ×1