我收到以下错误
Property 'navigationController' not found on object of type
我继承了这个项目,但不确定发生了什么。
在我的 didSelectRowAtIndexPath 中的 m 文件中有
[self.navigationController pushViewController:nextController animated:YES];
以前这不是问题,因为我正在访问应用程序委托(delegate)导航 Controller ,它们是 socket 。但是,我不得不放弃这种方法,因为它给我带来了问题。我已经转换了项目的其余部分。但是在这种情况下,项目没有使用普通的 TableView ,导航 Controller 看起来不可用。我在其他 7 个 View 中有这个问题。希望我能解决这个问题,并保持这个更干净的代码?
我真的对此感到困惑,我认为这是因为 SetsStyleSectionController 不是 View Controller 而是 NSObject。
但是,即使将此设置为 UIViewController,代码也会运行,但不会推送。 无法将 SetsSectionController 从 NSObject 更改为 UIViewController。
我不确定如何进行?
我正在摆脱应用委托(delegate)的推送。
编辑:下面讨论的屏幕截图 2
最佳答案
我在这里看到了几个问题。您对协议(protocol)和类有误解,并且您还有一个与协议(protocol)接口(interface)的应用程序,虽然本意是好的,但实际上却让您的生活比需要的更艰难。
您要处理的第一个问题是难以理解协议(protocol)和类之间的区别,以及采用协议(protocol)和从类继承之间的区别。这完全没问题,这东西并不容易。基本上,协议(protocol)只是对象的接口(interface),而类则同时提供接口(interface)和实现。换句话说,协议(protocol)只是可以调用的方法列表,而类既是方法列表又是执行这些方法的代码。要获得更完整的解释,也许您最好直接找到来源 - Apple 的 "The Objective-C Programming Language"可能会帮助你,所以请阅读那里的类和协议(protocol)。我认为这样做之后你就会明白为什么你没有成功地给出你的 id<SetSectionController>实例 a navigationController属性而没有明确定义一个。但是,如果您之后对此有任何具体问题,请告诉我。
更难解决的问题是这个 SetSectionController协议(protocol)。它有几个问题,对它们的描述不在本答案的范围之内。事情是这样的——实现基本上需要实现这个协议(protocol)的对象来知道哪个导航 Controller 与 TableView 相关联。到目前为止,这是通过将它们耦合到应用程序的委托(delegate)来提供的,deus ex machina,您可以删除这种耦合。但是现在您必须找到另一种方法来将正确的数据填充到 View Controller 中,以将其推送到导航堆栈上。
我认为您应该将推送逻辑移动到 View Controller 中,现在让部分 Controller 提供一个接口(interface),为 View Controller 提供它需要的信息。所以说部分 Controller 有一个像这样的伪代码的实现:
- (void)...didSelectRow...
{
id detailsForIndexPath = self.dataForRows[indexPath.row];
DetailViewController *vc = [DetailViewController new];
vc.details = detailsForIndexPath;
[APPDELEGATE.navigationController push:vc];
}
然后我会向 SetSectionController 添加一个方法叫做 -dataForRow: ,它的实现就像上面方法的第一行。然后,在你的 View Controller 中,实现 ...didSelectRow...像这样:
- (void)...didSelectRow...
{
id<SetSectionController> sc = self.sectionControllers[indexPath.section];
id details = [sc dataForRow:indexPath.row];
DetailViewController *vc = [DetailViewController new];
vc.details = details;
[self.navigationController push:vc];
}
如果您的部门管理员在 ...didSelectRow... 中做任何其他有用的事情确保将其移动到 View Controller 或转发 ...didSelectRow...现在转到部分 Controller 。
虽然我很欣赏尝试通过多态性使复杂的表部分更易于管理,但此协议(protocol)并不是实现此目的的正确方法。它盲目地从 UITableViewDelegate 中复制方法和 UITableViewDataSource不考虑这些问题是否是询问负责单个表的单个部分的问题的正确问题。如果您仍想使用它,我认为需要进行一些重要的重构才能使其成为真正让您的生活更轻松而不是更艰难的形状。根据每个部分逻辑偏差的复杂性,我可能会完全放弃它。但这真的是另一个问题。希望这对您有所帮助!
关于iphone - Obj-C,属性 'navigationController' 未在 NSObject 类的类型对象上找到?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12657004/
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou
在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss
我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby1.9+ 关于ruby-主要:Objectwhenrun