有很多问题有相同的标题但不知何故我觉得每个案例都不同,因为我的问题仍未解决,我不知道为什么,也没有足够的Swift解决方案。所以这是我的场景:
我使用CarbonKit在一个视图控制器中显示4个视图控制器。 FourthViewController
使用AlamoFire发送来电。它成功加载数据并重新加载tableView
。但是,当我拖动此表格视图时,我的应用程序崩溃了,我得到EXC_BREAKPOINT
,有时EXC_BAD_ACCESS
也是如此。
这是我尝试过的:
- [CALayer removeAllAnimations]:发送到解除分配实例的消息
所以当我检查时,我可能没有在这个课程中使用过的动画。但考虑到它在CarbonKit中,它们可能与它有关,但我无法弄明白。
以下是截图: 和 以下是Instruments 9.0僵尸消息给我的信息: 和
我在xCode的控制台中得到这个: 如果您需要更多信息,我会更新我的问题。
更新
当我使用Alamofire从网上获取数据时,这是我的代码。现在这个调用成功运行,我可以向下滚动查看表中加载的所有数据。但是当我向上滚动时,它会因上述错误而崩溃。
let headers = [
"security-token": "MY_SECURITY_CODE_HERE",
"Content-Type": "application/x-www-form-urlencoded"
]
let url = "URL_GOES_HERE"
//print(url)
Alamofire.request(url, method: .get, parameters: nil, encoding: JSONEncoding.default, headers: headers).responseJSON { response in
if let result = response.result.value as? [String: AnyObject] {
switch response.result {
case .success:
if result["status"] as! Int == 0
{
self.clearAllNotice()
let alert = UIAlertController(title: "Error",
message: "\(result["msg"] ?? "Our Server is not responding at the moment. Try again later!" as AnyObject)",
preferredStyle: UIAlertControllerStyle.alert)
let cancelAction = UIAlertAction(title: "OK",
style: .cancel, handler: nil)
alert.addAction(cancelAction)
self.present(alert, animated: true)
}
else
{
self.clearAllNotice()
for docReviewDict in (result["data"] as! [AnyObject]) {
let docReview = DoctorReview(dict: docReviewDict as! [String : AnyObject])
self.mainDoctorReviewsArray.append(docReview)
}
self.tableView.reloadData()
}
case .failure(let error):
self.clearAllNotice()
let alert = UIAlertController(title: "Something is wrong",
message: error.localizedDescription,
preferredStyle: UIAlertControllerStyle.alert)
let cancelAction = UIAlertAction(title: "OK",
style: .cancel, handler: nil)
alert.addAction(cancelAction)
self.present(alert, animated: true)
}
} else {
print("Somethins is wrong with the URL")
}
}
最新:
基于评论我已经完成了这个:
DispatchQueue.main.async {
self.tableView.reloadData()
}
但仍然是相同的结果
当我向下拖动表格视图时,在线程1:EXC_BAD_ACCESS(代码= 1,地址= 0xb4c4beb8)
let cell = tableView.dequeueReusableCell(withIdentifier: "ReviewCell") as! ReviewsTableViewCell
行上。
细胞的实施
班级名称为ReviewsViewController
,其中包含@IBOutlet fileprivate var tableView: UITableView!
。
然后在viewDidLoad()
:
tableView.delegate = self
tableView.dataSource = self
tableView.tableFooterView = UIView()
然后我有表视图委托和数据源:
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return mainDoctorReviewsArray.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "ReviewCell") as! ReviewsTableViewCell //WHEN THE APP IS CRASHED AS I DRAG THE TABLE VIEW IT CRASH ON THIS LINE. As this line is highlighted in red with message "Thread 1: EXC_BREAKPOINT (code=1, subcode=0x186ddd61c)"
cell.userPhoto.layer.cornerRadius = cell.userPhoto.frame.width / 2;
cell.userPhoto.layer.masksToBounds = true
cell.userName.text = mainDoctorReviewsArray[indexPath.row].name
cell.starRating.settings.fillMode = .precise
if let rate = mainDoctorReviewsArray[indexPath.row].rating
{
cell.starRating.rating = Double(rate)!
}
else {
cell.starRating.rating = 0
}
cell.desc.text = mainDoctorReviewsArray[indexPath.row].feedback
cell.dateOfReview.text = mainDoctorReviewsArray[indexPath.row].dates
cell.timeOfReview.text = mainDoctorReviewsArray[indexPath.row].times
return cell
}
在细胞类中只有:
import UIKit
import Cosmos
class ReviewsTableViewCell: UITableViewCell {
@IBOutlet var timeOfReview: UILabel!
@IBOutlet var dateOfReview: UILabel!
@IBOutlet var desc: UITextView!
@IBOutlet var starRating: CosmosView!
@IBOutlet var userName: UILabel!
@IBOutlet var userPhoto: UIImageView!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
tableView
的屏幕截图在此问题的上方。
这是4个ViewControllers加载的父类:dropbox.com/s/d5sh4ej1ssv6873/…这是具有tableview的类,在滚动时它崩溃了应用程序:dropbox.com/s/3kiju9hn3uewzar/ReviewsViewController.swift?dl=0
答案 0 :(得分:0)
如上所述,它可能与使用ui对象而非主线程有关。 如果您使用xCode 9,您应该将其视为运行时警告。 (您可以在EditScheme-> Diagnostics-> MainThreadChecker->问题中暂停设置复选标记。)
此外,您可以覆盖ReviewTableViewCell的dealloc方法并添加一些logs \ asserts以检查它是否从主线程调用。
通常情况下,如果您将view \ cell传递给某个块,并且在从块退出时释放此对象时会发生此崩溃。
答案 1 :(得分:0)
我会提出一些小建议来清理你的代码。不确定它是否能解决问题,但它有助于确保您的问题不是基于一些微不足道的事情。
我不确定你在哪里调用它,但在请求加载完成处理程序中,请确保弱捕获self
。
Alamofire.request(url, method: .get, parameters: nil, encoding: JSONEncoding.default, headers: headers).responseJSON { [weak self] response in
这样你就不会强迫对象保持活着,直到加载完成,这可能会导致它加载到错误的位置。
确保主线程上正在运行完成块(如上所述)。您正在调用UI,因此请检查它是否安全。
您的IB网点应声明为@IBOutlet weak var foo: UIView?
您可能通过强烈引用这些视图来解决自己的问题。
dequeueReusableCell(withReuseIdentifier:)
可以返回nil
。您应该使用dequeueReusableCell(withReuseIdentifier:for:)
- 并且不要忘记先使用register(_:forCellWithReuseIdentifier:)
注册单元格。
答案 2 :(得分:0)
您是否注册了细胞类类型?
如果没有在viewDidLoad中添加:
self.tableView.register(ReviewsTableViewCell.self, forCellReuseIdentifier: "ReviewCell")
接下来只是在cellForRow中将其出列:
let cell = tableView.dequeueReusableCellFor(identifier: "ReviewCell", indexPath: indexPath) as! ReviewsTableViewCell
检查错误是否仍在发生
答案 3 :(得分:0)
就我而言,这是在我执行此操作时发生的(myView
是单元格上的子视图)
myView.layer.sublayers?.forEach { $0.removeFromSuperlayer() }
我没有发现任何东西可以从您的代码中删除一层,但是如果您在那之外做过,那么我认为这就是问题所在。