我是 xcode 的新手,我正在尝试开发一个示例应用程序,它基本上是一个具有多个级别的嵌入式 tableview。我有一个 plist,它存储每个 tableview 的单元格。如果单元格没有 child ,那么我希望在按下单元格后能够转到一个详细 View 。最终我希望能够根据数据类型转到不同的详细 View 。为此,我从 Storyboard创建了一个详细 View ,将我的 View Controller 拖到我的详细 View 以创建一个手动“Push”转场,并将转场标记为“segue1”。
编辑源代码here
接下来我填充我认为是它工作所必需的函数,即调用 [self performSegueWithIdentifier:@"segue1"sender:myString]; 其中 myString 是我选择的单元格。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
//Check the dictionary to see what cell was clicked
NSDictionary *dict = [self.tableDataSource objectAtIndex:indexPath.row];
NSString *myString = [dict objectForKey:@"Title"];
NSDictionary *dictionary = [self.tableDataSource objectAtIndex:indexPath.row];
NSArray *children = [dictionary objectForKey:@"Children"];
//If there is no children, go to the detailed view
if([children count] == 0)
{
[self performSegueWithIdentifier:@"segue1" sender:myString];
}
else{
//Prepare to tableview.
DrillDownViewController *rvController = [[DrillDownViewController alloc] initWithNibName:nil bundle:[NSBundle mainBundle]];
//Increment the Current View
rvController.CurrentLevel += 1;
//Set the title;
rvController.CurrentTitle = [dictionary objectForKey:@"Title"];
//Push the new table view on the stack
[self.navigationController pushViewController:rvController animated:YES];
rvController.tableDataSource = children;
}
}
最后,我调用了 prepare for segue 来查找标记为 segue1 的 segue。
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if([[segue identifier] isEqualToString:@"segue1"])
{
DrillDownDetailController *dvController = [[segue destinationViewController] visibleViewController];
//DrillDownDetailController *dvController = [[DrillDownDetailController alloc] initWithNibName:nil bundle:[NSBundle mainBundle]];
[dvController setItemName:(NSString *)sender];
[self.navigationController pushViewController:dvController animated:YES];
}
}
我认为这可行,但出于某种原因,每当代码到达 [self performSegueWithIdentifier:@"segue1"sender:myString]; 时,它会因错误而中断
***** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“Receiver () 没有标识符为‘segue1’的 segue” * 首先抛出调用栈: (0x14b4022 0xeb4cd6 0xdf61b 0x3590 0xa85c5 0xa87fa 0x93d85d 0x1488936 0x14883d7 0x13eb790 0x13ead84 0x13eac9b 0x139d7d8 0x139d88a 0x17626 0x23ed 0x2355 0x1) 终止调用抛出异常(lldb)
我不明白为什么它告诉我它找不到 segue1,因为它已经在 Storyboard和代码中定义了。
最佳答案
实际上有几个问题:
首先,在您为我们上传的项目中,segue 不带有“segue1”标识符:
如果您还没有填写该标识符,则应填写。
其次,当您从 TableView 推送到 TableView 时,您正在调用 initWithNibName 来创建 View Controller 。你真的想使用 instantiateViewControllerWithIdentifier。
因此,这一行说:
DrillDownViewController *rvController = [[DrillDownViewController alloc] initWithNibName:nil bundle:[NSBundle mainBundle]];
应该说:
DrillDownViewController *rvController = [self.storyboard instantiateViewControllerWithIdentifier:@"TableView"];
第三,您的prepareForSegue是:
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if([[segue identifier] isEqualToString:@"segue1"])
{
dvController = [[segue destinationViewController] visibleViewController];
[dvController setItemName:self->nameToSend];
}
}
并且应该简化以消除对 visibleViewController 的引用,例如:
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if([[segue identifier] isEqualToString:@"segue1"])
{
dvController = segue.destinationViewController;
dvController.itemName = nameToSend;
}
}
第四,你的DrillDownDetailController.m有这个方法:
-(void) setItemName:(NSString *)itemName
{
if(!itemName)
{
itemName = [[NSString alloc] initWithString:itemName];
}
label.text = itemName;
}
这里有很多问题,但您根本不应该在这里更新 label.text(因为它可能尚未创建!)。你应该完全消除这个自定义 setter 方法(让 Xcode 为你合成标准的 setter)并且只改变你的 viewDidLoad 如下:
- (void)viewDidLoad
{
[super viewDidLoad];
label.text = self.itemName;
}
确保在 viewDidLoad 之前不更新 UI 对象!
我还没有完成整个程序,但是通过这四次更正,我可以点击“SubItem1”,然后点击“Cars”,然后点击“BMW”,然后我会看到一个显示“BMW”的详细信息屏幕。我认为你的 plist 在其他项目上存在一些问题(例如,鞋子条目是字符串,而不是字典条目,你会得到一个错误......我想你只是没有完全填写你的 plist),但上面的修复更正更重要的编码问题。
关于ios - 通过 Storyboard和 xcode 正确创建手动 segue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12518271/
出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在
我正在使用puppet为ruby程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这
我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击
如何使用RSpec::Core::RakeTask初始化RSpecRake任务?require'rspec/core/rake_task'RSpec::Core::RakeTask.newdo|t|#whatdoIputinhere?endInitialize函数记录在http://rubydoc.info/github/rspec/rspec-core/RSpec/Core/RakeTask#initialize-instance_method没有很好的记录;它只是说:-(RakeTask)initialize(*args,&task_block)AnewinstanceofRake
我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是
我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search