1. 问题一
表现方面:自己布局的时候用tableview中的cell的宽度来确定其他控件的坐标,结果发现出现了问题第一次进入的时候布局是错乱的,第二次发现坐标布局是正确的。
解决方法:把控件的坐标判断用确定的宽度来写。比如说tableView的宽度。还有屏幕的宽度以及其他确定的宽度。
产生的原因:
2.问题二
技术点解析:今天在写项目的时候把cell的渲染写在cell里。没有写到控制器里。这样写的好处是提高了代码的复用。并且降低了代码间的耦合度。高内聚低耦合。比如说
在cell的.h里面写。
+ (
RyxCommentListViewCell
*)renderCommentListCell:(
UITableView
*)tableView cellForRow:(
NSInteger
)row dataSoueceElement :(
id
)dataSourceElement;
+ (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath dataSoueceElement:(id)dataSourceElement cell:(RyxCommentListViewCell *)cell;
在.m里面进行
+ (UITableViewCell *)renderCommentListCell:(UITableView *)tableView cellForRow:(NSInteger)row dataSoueceElement:(id)dataSourceElement {
RyxCommentListViewCell
*cell = [tableView
dequeueReusableCellWithIdentifier
:
@"commentListCell"
];
cell. dataSourceElement = dataSourceElement;
RyxCommentOC *commentOC = ( RyxCommentOC *)dataSourceElement[row];
cell. dataSourceElement = dataSourceElement;
RyxCommentOC *commentOC = ( RyxCommentOC *)dataSourceElement[row];
[[cell thunmbnailImageView] setImage:[[RyxSharedStoragesharedStorage]launchScreenImage]];
[[cell
thunmbNameLabel
]
setText
:[[commentOC
owner
]
name
]];
NSString *timeStamp = [ RyxTimeStamp getTimeIndicateCreateAt :[commentOC timestamp ]];
[[cell timeStampLabel ] setText :timeStamp];
[[cell commentContentLabel ] setText :[commentOC content ]];
return cell;
NSString *timeStamp = [ RyxTimeStamp getTimeIndicateCreateAt :[commentOC timestamp ]];
[[cell timeStampLabel ] setText :timeStamp];
[[cell commentContentLabel ] setText :[commentOC content ]];
return cell;
}
// 这个方法主要目的是为了自适应高度。
+ (
CGFloat
)tableView:(
UITableView
*)tableView heightForRowAtIndexPath:(
NSIndexPath
*)indexPath dataSoueceElement:(
id
)dataSourceElement cell:(
RyxCommentListViewCell
*)cell {
cell. dataSourceElement = dataSourceElement;
RyxCommentOC *commentOC = ( RyxCommentOC *)dataSourceElement[indexPath. row ];
[[cell commentContentLabel ] setText :[commentOC content ]];
[cell sizeToFit ];
[cell setNeedsLayout ];
CGFloat height = [cell systemLayoutSizeFittingSize : UILayoutFittingCompressedSize ]. height ;
return height + 1;
}
cell. dataSourceElement = dataSourceElement;
RyxCommentOC *commentOC = ( RyxCommentOC *)dataSourceElement[indexPath. row ];
[[cell commentContentLabel ] setText :[commentOC content ]];
[cell sizeToFit ];
[cell setNeedsLayout ];
CGFloat height = [cell systemLayoutSizeFittingSize : UILayoutFittingCompressedSize ]. height ;
return height + 1;
}
3.问题三:
今天遇到一个问题就是cell里面有两个label 对cell渲染是在cell类里面的并没有在view controller里渲染。点击cell中的label想要响应一个方法 采用以下的方法 来解决。
public
extension
UIView
{
public
func
viewController() ->
UIViewController
? {
let vcc = UIViewController . self
var responder: UIResponder ? = self
while responder != nil {
if (responder?. isKindOfClass (vcc) != nil ) {
return responder as ? UIViewController
}
responder = responder?. nextResponder ()
}
return nil
}
let vcc = UIViewController . self
var responder: UIResponder ? = self
while responder != nil {
if (responder?. isKindOfClass (vcc) != nil ) {
return responder as ? UIViewController
}
responder = responder?. nextResponder ()
}
return nil
}
}
通过这个view找到他的响应者view controller 然后可以通过这个view controller来进行跳转。
4. 问题四:
自己在写代理方法的时候出现警告:Assigning to 'id<xxxProtocol> from incompatible type 'ViewController *const __strong'
这个错误自己不应该犯了,原因是自己写了代理可是没有遵循这个代理。加上代理实现代理方法就ok了。