本周在 iOS 上踩过的坑主要有

UITableView 相关

在写 UITableView 的 Demo 时,删除一个 cell 导致程序崩溃

在写 dataSource protocol 中的- (NSInteger)numberOfRowsInSection:(NSInteger)section方法时,采用了 hardcode 方式。这个函数的返回值应该实时计算。

UITableView 的背景色

想要设置 UITableView 的背景色,可以采用下面的语句。

1
2
self.tableView.backgroundView = nil;
self.tableView.backgroundColor = [UIColor whiteColor];

添加 Static 样式的 TableView 到另一个 View

从 XCode 特定版本之后,Static 样式的 TableView 只能添加到一个 UITableViewController 中。要想添加一个 Static 样式的 TableView 到其他的 View 中,必须先添加一个 Container View,然后在其内部添加。

其实通过编辑 UITableViewController 中 Static 样式的 TableView 的 tableHeaderView 以及 tableFooterView 就可以实现很多效果,不一定要使用上面的方法。

UIWebView 相关

UIWebView 与 UINavigationController 的配合

当想让程序中的 UIWebView 后退与前进采用 UINavigationController 的返回按钮时,可以考虑重载

1
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType

这个函数返回NO时就会终止加载。每当加载页面时,新建一个 UIWebViewController,然后 push 进去及可利用 UINavigationController 自带的返回按钮。

UIWebView 的后退

采用下面的方式让 WebView 返回最早的页面会进入死循环,内存暴涨。

1
2
3
4
while([webView canGoBack])
{
[webView goBack];
}

因为goBack的完成需要一定时间,期间canGoBack的值一直为真。正确的方式之一是设置一个 flag,在webViewDidFinishLoad中根据这个 flag 和canGoBack来循环后退。

自定义 UIView + xib

原理是将 xib 的 file’s owner(不是 UIView 的 custom class)设置成自定义的 UIView 子类,在子类的初始化方法中加载 xib 内容。

``

  • (instancetype)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];

    if (self) {

    [[NSBundle mainBundle] loadNibNamed:@"CustomView" owner:self options:nil];
    self.contentView.frame = self.bounds;
    [self addSubview:self.contentView];
    

    }

    return self;
    }
    ```

One more pit

项目中使用到了开源的 JDFlipNumberView 来显示令牌上的数字。我看了一下 readme,发现这个库是自带一些动画效果的,它有两套 API,而项目中使用的是静态的版本,I can not endure!

结果测试发现,当在动画过程中切换 tabbar 后再切换回来,这个控件会 freeze 在一个中间状态!

尝试在 viewWillAppear中重新设置控件显示的值,反复测试还是会有这个问题,最后因为发布日期将近,还是去掉了动画效果。

给鸡排饭加个蛋