- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我是编程新手,在尝试通过将 tableView 和关联 View 的创建移动到单独的类并将委托(delegate)和数据源从 VC 移动到单独的类来精简我的 ViewController 时遇到了一些问题。
我目前的文件和工作的星座如下:
我从另一个类实例化 View
var detailView: DetailView! { return self.view as? DetailView }
一旦我将下载 UI 的第一部分(单独调用效果很好)
我正在转向凌乱且超出我能力的部分
我调用函数 createReposCard()
dispatchGroup.notify(queue: dispatchQueue) {
DispatchQueue.main.async {
// slide animation
UIView.animate(withDuration: 0.75, delay: 0.5, usingSpringWithDamping: 0.9, initialSpringVelocity: 0.0, options: [], animations: {
self.detailView.reposCard.center = CGPoint(x: self.detailView.reposCard.center.x, y: self.detailView.reposCard.center.y-UIScreen.main.bounds.height)
}, completion: nil)
self.detailView.createReposCard(for: self.repos)
self.detailView.detailsTableView.reloadData()
self.activityIndicator.stopAnimating()
self.activityIndicator.removeFromSuperview()
}
}
代码不完整,只能描述问题,具体做了什么一一说明。我正在传递有关选定用户的信息(无关信息)然后我正在引用我的 DetailsViewController,它仍然是例如持有 CoreData 栈
在初始化程序中,我正在实例化 detailsViewController 并将其传递给持有委托(delegate)的类(我将其传递给那里有对 CoreData 的引用)
class DetailView: UIView {
var selectedUser: User?
var detailsViewController: DetailsViewController!
let detailsTableView: UITableView = {
let tableView = UITableView()
tableView.frame = CGRect.zero
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "reposCell")
return tableView
}()
init(selectedUser:User, frame: CGRect) {
super.init(frame: frame)
self.selectedUser = selectedUser
detailsViewController = DetailsViewController()
let tableViewDelegates = TableViewDelegates(detailsViewController: detailsViewController)
detailsTableView.delegate = tableViewDelegates
detailsTableView.dataSource = tableViewDelegates
}
最后代码跳转到描述的类中,我被“隐式展开时意外发现 nil...”击倒了
public class TableViewDelegates: NSObject, UITableViewDataSource,UITableViewDelegate {
private let detailsViewController: DetailsViewController
init(detailsViewController: DetailsViewController){
self.detailsViewController = detailsViewController
siêu.init()
}
public func numberOfSections(in tableView: UITableView) -> Int {
return detailsViewController.fetchedResultsController.sections?.count ?? 1
}
...
其实我也不知道自己的概念好不好,感觉很迷茫,但我的初衷是这样的:
但正如我所见,简单的数据传递正在克服我的能力。
câu trả lời hay nhất
我觉得这个问题可以分为两部分:
我认为我们没有足够的信息来准确回答这个问题,但我的总体方法是这样的:
关于第 2 步有一个特别的观察:您应该检查方法的执行顺序以确保变量被正确初始化。我为什么要强调这一点?因为某些 View (例如 detailView
)有可能像普通的 UIView 一样被初始化,
然后您尝试访问不属于 的元素UIView
对象(例如,表格 View )。换句话说,在尝试访问它们之前检查您是否设置了自定义 View 。
这是一个更有趣的问题,我认为选择更好的方法将帮助您避免遇到类似您遇到的问题。我将把它分成一些主题。这里的所有内容都是我的个人意见,不一定反射(reflect)最佳方法,尤其是因为这里的“最佳”是主观的。
PersistenceManager 类
首先,将 View Controller 的引用传递给另一个类只是为了访问 CoreData 似乎不是一个好的选择。例如,更好的方法是使用 PersistenceManager
类。您可以使用此类的对象来获取和保存数据。您可以传递此对象而不是 View Controller 。
在某些架构中(例如,VIPER), View Controller 直接访问持久性是不正确的,因此传递一个已获取对象的数组会更合适。例如:
class TableViewController {
private let tableView: UITableView!
private var currentlyDisplayedUsers: [Users]?
func displayUsers(_ users: [Users]) {
self.currentlyDisplayedUsers = users
self.tableView.reloadData()
}
}
在上面的示例中,tableView
将显示 currentlyDisplayedUsers
,这将由方法 displayUsers
更新,该方法将被某人调用否则,就像演示者一样。
网络类
其次,我认为你应该有一个网络类来从互联网上下载数据。您将在应用程序逻辑中使用 Network 类的实例。换句话说,你会有类似的东西
// This is in the application logic
// In MVC, the logic is in the Controller, while in VIPER the logic is in the Interactor
class ApplicationLogic {
let networkAPI: Network?
...
func fetchUserData() {
networkAPI?.fetchUsers() { data, error in
// Update the UI based on the response
// Using the previous example, you could call displayUsers here
}
}
}
TableView、TableViewDelegate 和 TableViewDataSource
最后,如何组织这些家伙。 UITableViewDelegate
负责告诉我们表中的事件,而 UITableViewDataSource
负责用数据填充表,这意味着两者都与 TableView 本身密切相关。也就是说,恕我直言,两者都应该在不同的 swift 文件中实现,但作为具有对 TableView 的引用的 View Controller 的扩展。有点像
// TableViewController+UITableViewDelegate.swift
extension TableViewController: UITableViewDelegate {
...
}
// TableViewController+UITableViewDataSource.swift
extension TableViewController: UITableViewDataSource {
...
}
使用这种方法,委托(delegate)和数据源可以访问前面提到的 người sử dụng
数组。 Đây是如何使用 VIPER 实现类似方法的示例。
所以,我希望我能提供有关这些主题的基本概念。如果您想了解更多有关如何构建代码的信息,我建议您研究 iOS 设计模式和架构模式。 iOS 开发中一些著名的架构设计模式是 MVC、MVP、MVVM 和 VIPER。
关于swift - 通过移走 TableView 使 ViewController 更 slim ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57595878/
Tôi có một hàm chuyển đổi một Bản ghi ADO thành html: class function RecordsetToHtml(const rs: _Recordset): WideString;
Sau vài ngày nghiên cứu và thảo luận, tôi đã nghĩ ra phương pháp này để thu thập entropy của khách truy cập (bạn có thể xem lịch sử nghiên cứu của tôi tại đây) Khi người dùng truy cập, tôi chạy mã này: $entropy=sha1(microtime(). $pepper .$_SERVE
Đưa ra một Danh sách không có thứ tự, tôi cần tìm xem có Chuỗi nào khớp với chuỗi được cung cấp hay không. Vì vậy, tôi lặp for (String k : key) { if (Utils.keysM
Tôi đã tìm kiếm câu hỏi này nhưng chưa tìm thấy câu trả lời mà tôi đang tìm kiếm. Về cơ bản, tôi muốn bọc hàm tạo của lớp trong một mệnh đề thử/ngoại trừ để nó bỏ qua các loại lỗi cụ thể trong hàm tạo (nhưng vẫn ghi nhật ký và in chúng). Tôi thấy rằng làm được điều này
Tôi có một bộ ba số và tôi muốn so sánh một bộ số này với một bộ số khác. Tức là mọi số trong nhóm thứ nhất đều nhỏ hơn ít nhất một số trong nhóm kia. Lưu ý rằng số tiếp theo trong nhóm đầu tiên phải nhỏ hơn số khác trong nhóm thứ hai (tức là {6,1,6} so với {8,8,
đóng cửa. Câu hỏi này lạc đề. Hiện tại nó không chấp nhận câu trả lời. Bạn muốn cải thiện câu hỏi này? Đã cập nhật câu hỏi để nó phù hợp với chủ đề về Stack Overflow. Đóng cửa 9 năm trước Cải thiện điều này
Đầu tiên là một số thông tin cơ bản: Tôi đang phát triển một ứng dụng doanh nghiệp (tai) với các mô-đun EJB và các mô-đun máy khách ứng dụng. Tôi cũng sử dụng JPA ngủ đông để duy trì và swingx cho GUI. đây là những thứ duy nhất
Tôi đang cố chạy Eclipse trên netbook của mình để có thể phát triển cho Android. Như bạn có thể đoán, Eclipse rất chậm và không dễ phát triển một cách hiệu quả. Tôi đang sử dụng Linux Ubuntu và tôi cũng có
đối với hàng, công cụ trong enumerate(công cụ): đối với cột, giá trị trong enumerate(công cụ):
return not a and not b ^ Làm cách nào tôi có thể diễn đạt nó ở định dạng tốt hơn Câu trả lời hay nhất có thể là Luật DeMorgan? return not (a hoặc b) Tôi nghĩ nó đủ đơn giản vào thời điểm này
Tôi đang cố gắng làm cho các biểu tượng Font Awesome trông mỏng hơn https://jsfiddle.net/cliffeee/7L6ehw9r/1/. Tôi đã thử sử dụng "-webkit-text-strok.
Giả sử tôi có một khung dữ liệu được gọi là vals như sau: id…………date…………min_date…………maxdate1………2016/01/01… …………2017/01/01……… …2018/
Có cách nào Pythonic hơn để làm điều này không? : if self.name2info[name]['prereqs'] là Không có: se
Tôi có chức năng in một số văn bản ra dòng và nó nhận được. Nếu ostream nhắm mục tiêu vào một thiết bị đầu cuối, tôi muốn nó thích ứng với độ rộng của thiết bị đầu cuối, nếu không thì mặc định là một số giá trị. Những gì tôi đang làm bây giờ là: Nhận ofstre từ ostream
Câu hỏi này đã có câu trả lời ở đây: Phương thức truy xuất có nên trả về 'null' hoặc đưa ra một ngoại lệ khi nó không thể tạo ra
Tôi có cái này bc = 'off' if c.page == 'blog': bc = 'on' print(bc) Có cách nào Pythonic hơn (và/hoặc ngắn hơn) để viết cái này bằng Python không? tối ưu
Đầu vào: Một CSV có 50.000 hàng; mỗi hàng chứa 910 cột giá trị 0/1. Đầu ra: Khung dữ liệu mà CNN của tôi được chạy từ đó. Tôi đã viết mã đọc từng dòng CSV. Với mỗi hàng, tôi chia dữ liệu thành hai phần gọi là nơ-ron (90
Theo như tôi biết, with block tự động gọi close() sau khi bạn thoát khỏi khối và nó thường được sử dụng để đảm bảo bạn không quên đóng tệp. Dường như không có sự khác biệt về mặt kỹ thuật với open(file, 'r+') as f
Tôi có một trang web MVC 5 sử dụng Entity Framework V6.1.1. Lớp và mô hình Entity Framework DbContext ban đầu có trong dự án trang web. Dự án này có 3 DbCont
Tôi mới làm quen với lập trình và đã gặp phải một số vấn đề khi cố gắng hợp lý hóa ViewContoder của mình bằng cách di chuyển việc tạo bảngView và Chế độ xem được liên kết sang các lớp riêng biệt và chuyển đại biểu và nguồn dữ liệu từ VC sang một lớp riêng.
Tôi là một lập trình viên xuất sắc, rất giỏi!