V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iOS 开发实用技术导航
NSHipster 中文版
http://nshipster.cn/
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
CocoaPods
http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Design Guides and Resources
https://developer.apple.com/design/
Transcripts of WWDC sessions
http://asciiwwdc.com
Cocoa with Love
http://cocoawithlove.com/
Cocoa Dev Central
http://cocoadevcentral.com/
NSHipster
http://nshipster.com/
Style Guides
Google Objective-C Style Guide
NYTimes Objective-C Style Guide
Useful Tools and Services
Charles Web Debugging Proxy
Smore
jox
V2EX  ›  iDev

教训啊。。。。从 IB 里拽出来的 view 的引用不能重构

  •  
  •   jox · 2014-10-30 10:45:46 +08:00 · 3047 次点击
    这是一个创建于 3679 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我把IB里配置的一个view拽了出来,设置为controller的一个weak属性,命名content,然后在后面引用的时候都是这样干的:

    self.content ...
    self.content ...

    这时候我想做一下调整,把名字改为contentWrapper,然后就发现重构不好使了,IB里的对象是编码保存在XML文件里的,应用运行的时候会先从XML文件里解码得到对象然后动态地给这样从IB里拽出来的IBOutlet属性赋值,xcode没法做静态分析,于是就不能重构了,当时写这个文件的时候图省事儿,现在想改就有点麻烦了,改完名字一下蹦出来10多个错误,贪小便宜吃亏了。。。IB好用是好用,但是不明白其中的道理的话,有的时候反而会带来麻烦,如果有不知道这个的朋友在用IB的时候得注意一下了
    第 1 条附言  ·  2014-10-30 13:47:05 +08:00
    不对,刚才我又尝试了一下使用xcode的重构功能来重新命名另一个IBOutlet的属性,这回却成功了,现在我懵了。

    现在有两种可能:

    - 我记错了,我当时没有用重构,而是直接对属性名进行修改

    - 我在IB里面的某个操作造成了这种结果

    我自己记得是使用了重构的,因为上午我调整了一下storyboard里的内容,然后还做了一些操作,然后就发现重构不好使了,但是我想不起来我在storyboard里面都做了什么。。。。我再研究研究。。。。
    第 2 条附言  ·  2014-10-30 14:05:38 +08:00
    这似乎是xcode本身的bug,我又实验了一下,这次重构的过程中xcode直接卡住不动了。。。。xcode应该是可以重构IBOutlet属性的,但是好像在哪里有问题,我上午重构的那个属性是在IB里创建的一个container view,当时是为了少写一些代码就用了,问题似乎就出在这个container view上,我刚试了几下,发现container view会自己消失!这个并不是我删除的,我编辑storyboard的时候它自己就没了,额,我现在也搞不清楚到底是怎么回事了,不过我还是觉得IBOutlet在使用的时候还是得谨慎一些。
    14 条回复    2014-10-30 16:09:00 +08:00
    knightlhs
        1
    knightlhs  
       2014-10-30 10:49:53 +08:00
    基本上 如果不是为了图快 都是用代码实现
    不过需要写的真TMD多
    jox
        2
    jox  
    OP
       2014-10-30 11:01:27 +08:00
    @knightlhs 我现在觉得就得是那种特别简单,保证不会变的东西才能用IB,而且还得谨慎地琢磨一下,这玩意儿到底能不能用IB,用不用?用不用?到底特么地能不能用?

    反正挺纠结的。。。用IB有些配置就容易点,拿鼠标点一点就行,不用一行一行地在代码里配置,但就怕出现这样的问题,不好控制。

    IB只能编码对象和对象之间的关系,应用的逻辑不能编码,这个也挺蛋疼的,我的教训就是用IB用HIGH了,后来发现涉及到了逻辑问题,一下傻眼了,还得回去老老实实地用代码来控制,感觉IB就得用来保存一些配置好的对象,配好ID然后用的时候从XML里取,否则用多了经常出问题
    knightlhs
        3
    knightlhs  
       2014-10-30 11:03:33 +08:00
    外包项目必须用IB不然满足不了时效要求
    自己的产品也可以 不过可以考虑把内部元素用IB实现
    但是外部的界面必须用代码
    像拼积木一样处理

    不然万一要重构 太痛苦了 跟重写也没啥区别了
    jox
        4
    jox  
    OP
       2014-10-30 11:07:00 +08:00
    @knightlhs 是啊,就得把IB当做材料库,然后用代码做胶水,把对象一个个拼接起来。

    要是在好多地方都大量使用IBOutlet,我简直不敢想象如果出现问题那得需要多少工作量啊,想想就觉得蛋痛
    nagato
        5
    nagato  
       2014-10-30 11:13:31 +08:00
    鼠标右键->Refactor->Rename
    jox
        6
    jox  
    OP
       2014-10-30 11:17:39 +08:00
    @nagato ...
    iimare
        7
    iimare  
       2014-10-30 12:36:24 +08:00
    你需要做得是将鼠标指针放在需要重命名的地方Edit->Refactor->Rename,更改名字,Perview,然后看看Perview的结果里xib的名字变了吗?
    还有,我现在觉得IB布局实在是太方便了,尤其你要使用Autolayout的时候
    jox
        8
    jox  
    OP
       2014-10-30 12:39:05 +08:00
    @iimare 。。。。。你再好好看看我的帖子,运行过程中动态生成的对象xcode没办法做静态分析,重构的基础就是对源代码进行静态分析,

    我真是无语了
    fgwww
        9
    fgwww  
       2014-10-30 13:25:51 +08:00
    完全没有理解是什么问题,其他人这样用不都是好好的么
    krafttuc
        10
    krafttuc  
       2014-10-30 13:32:35 +08:00
    很多莫名其妙的问题可能就是你在 IB 的某个小角落打了个勾或是忘了改某个属性。这是 NIB 对 debug 不友好的地方。排查这些错误不光费时间,而且很 frustrating。所以我到现在依然不是 IB 的 fan。
    iimare
        11
    iimare  
       2014-10-30 14:01:03 +08:00
    @jox我明白你的意思啊,我确实成功了
    jox
        12
    jox  
    OP
       2014-10-30 14:05:58 +08:00
    @iimare 我刚又试了一下,这次却成功了,我现在也懵了,汗
    LINAICAI
        13
    LINAICAI  
       2014-10-30 15:46:07 +08:00
    除了cell,说什么也不能用ib或者故事版,太费劲了。
    jox
        14
    jox  
    OP
       2014-10-30 16:09:00 +08:00
    @LINAICAI 我uitableview用的到的地方也很有限,好多列表都是动态生成的,高度、内容都不一样,用tableview的话,得调用delegate的返回高度的那个回调函数,随着滚动还老调用返回cell的回调函数,用了几次觉得太费劲了,还遇到过bug,干脆不用了,直接用scrollview画列表。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1041 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 22:20 · PVG 06:20 · LAX 14:20 · JFK 17:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.