关键词:
【中文标题】尝试通过委托方法更新 tableview 时出现弱和委托失败警告【英文标题】:Weak and delegate fail-warnings when trying to update tableview through delegate method 【发布时间】:2018-07-30 03:20:24 【问题描述】:我一直在努力通过我制作的另一个课程来更新我的表格视图。 然后我找到了这个***解决方案: How to access and refresh a UITableView from another class in Swift
但是当我一步一步执行所有代码时,我得到以下错误:
我的台词:
weak var delegate: UpdateDelegate?
得到警告
'weak' may only be applied to class and class-bound protocol types, not 'UpdateDelegate'
还有我的台词:
self.delegate.didUpdate(self)
收到警告:
Instance member 'delegate' cannot be used on type 'APIgetter'
这可能是因为代码太旧而我使用的是 swift 4 吗?否则我不明白为什么这应该失败。我希望你能帮助我:)
更新:
我的协议:
protocol UpdateDelegate: AnyObject
func didUpdate(sender: APIgetter)
我的 ViewController 中包含 tableview 的片段:
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UpdateDelegate
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad()
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
APIgetter.addDataFromSQL()
let updates = APIgetter()
updates.delegate = self
//update func
func didUpdate(sender: APIgetter)
DispatchQueue.main.async
self.tableView.reloadData()
我在 APIgetter.swift 中的 APIgetter 类:
class APIgetter
weak var delegate: UpdateDelegate?
class func addDataFromSQL ()
//Code to fetch data from API
//Code that comes after DispatchQueue.global & DispatchQueue.main and my result being executed
//result
self.delegate.didUpdate(self)
【问题讨论】:
【参考方案1】:只需更新您的协议定义。
protocol UpdateDelegate: class
// protocol body
或
protocol UpdateDelegate: AnyObject
// protocol body
这是必需的(我认为从 Swift 4 开始),因为类是引用类型,您只能对引用类型使用弱引用。不是像结构这样的值类型。
更新:您无法像当前那样从静态函数访问属性/实例成员。从函数中删除 class 关键字,它应该可以工作。
如果您希望/需要在整个应用程序中使用此类的单个实例,您可以使用静态属性使其成为单例
class APIgetter
static let shared: APIgetter = APIgetter()
那么你就可以像这样访问它了:
APIgetter.shared.addDataFromSQL()
您也可以在调用您的函数之前以相同的方式更新委托。
APIgetter.shared.delegate = self
我认为在这种情况下,我会使用没有委托的单例。只需在您的函数中使用完成处理程序。如果不小心管理,在共享实例上设置和更改委托可能会产生一些副作用。
【讨论】:
太棒了,谢谢!但我仍然收到“Instance member 'delegate' cannot be used on type 'APIgetter'”错误 您能否发布更多代码,如果不知道您是如何定义类/协议的,这很难提供帮助。什么是 APIgetter? @dafo 对于该错误,请参阅here。基本上,委托是一个 instance 变量。但是,您的addDataFromSQL
与实例无关,因为您将其定义为 class 函数。如果您从func
中删除class
,那么它应该可以工作...
啊是的,就像亲爱的说的那样。您正在访问的函数是静态/类函数,无法访问这样的实例成员。谢谢亲爱的tableView 编辑委托方法不起作用(无效更新:第 0 节中的行数无效)
】tableView编辑委托方法不起作用(无效更新:第0节中的行数无效)【英文标题】:tableVieweditingdelegatemethodnotworking(Invalidupdate:invalidnumberofrowsinsection0)【发布时间】:2014-09-1809:42:11【问题描述】:\'NSInternalInconsistencyException\',原因... 查看详情
设置 tableview 数据源和委托的适当方法
】设置tableview数据源和委托的适当方法【英文标题】:Appropiatewaytosetatableviewsdatasourceanddelegate【发布时间】:2014-12-1902:24:36【问题描述】:好的,所以我有tableview控制器1。在tableview控制器1的didSelectRowAtIndexPathMethod内部,我尝试根... 查看详情
位置管理器委托调用更新 TableView 问题
】位置管理器委托调用更新TableView问题【英文标题】:LocationManagerdelegatecalltoupdateTableViewissue【发布时间】:2017-10-2315:57:05【问题描述】:我有一个tableView,其中填充了fetchedResultsController。一切正常。就目前而言,tableView根据需... 查看详情
调用 tableView.reloadData() 时出现“致命错误”,tableView 连接正确
】调用tableView.reloadData()时出现“致命错误”,tableView连接正确【英文标题】:"fatalerror"whencallingtableView.reloadData(),thetableViewisproperlyconnected【发布时间】:2017-12-0404:23:09【问题描述】:我正在尝试在程序运行时动态更新table... 查看详情
IOS:两个tableview的tableview委托方法
】IOS:两个tableview的tableview委托方法【英文标题】:IOS:tableviewdelegatemethodsfortwotableview【发布时间】:2011-06-2911:11:11【问题描述】:我在一个类中为tableview提供了这些委托方法:-(NSInteger)numberOfSectionsInTableView:(UITableView*)tableViewretur... 查看详情
通过服务帐户设置 Gmail 委托时出现权限不足错误
...题描述】:我有一个具有域范围委派的服务帐户,我正在尝试使用该帐户通过AppScript应用程序设置Gmail委派。我正在为应用脚本使用Google的OAuth2库。源用户(他们的 查看详情
委托通过后无法将数据加载到tableview
】委托通过后无法将数据加载到tableview【英文标题】:Can\'tloaddatatotableviewafterithasbeenpassedwithdelegation【发布时间】:2016-06-0718:19:27【问题描述】:我将一个带委托的数组传递给tableviewcell,在那里我有tableview。然后我将此数组分配... 查看详情
UICollectionView 委托方法的问题
...法。这是我正在尝试做的事情:在Storyboard上,我有一个UITableViewController,其中有一个TableView和一个UIVie 查看详情
tableView:didEndEditingRowAtIndexPath: 委托方法调用了两次
】tableView:didEndEditingRowAtIndexPath:委托方法调用了两次【英文标题】:tableView:didEndEditingRowAtIndexPath:delegatemethodcalledtwice【发布时间】:2014-11-1713:47:45【问题描述】:我想知道用户何时对UITableView的单元格应用滑动操作。根据文档,... 查看详情
为啥当我添加 UITapGestureRecognizer 处理程序方法时 TableView 委托方法停止工作
】为啥当我添加UITapGestureRecognizer处理程序方法时TableView委托方法停止工作【英文标题】:WhydoestheTableViewdelegatemethodsstopworkingwhenIaddaUITapGestureRecognizerhandlermethod为什么当我添加UITapGestureRecognizer处理程序方法时TableView委托方法停止... 查看详情
通过 CoreData 和委托在静态 tableView 单元格之间传递变量
】通过CoreData和委托在静态tableView单元格之间传递变量【英文标题】:PassingvariablesacrossstatictableViewcellsviaCoreDataanddelegates【发布时间】:2017-01-0122:25:50【问题描述】:我有一个启用了ConfigureTableViewController的tableview,它有两个静态... 查看详情
在 reloadData 后未调用 cellForRowAtIndexPath
...新的表视图控制器。我已经设置了数据源和委托,并且在tableview的初始加载时,一切都按预期工作。我有一个在数据源更新后调用的委托方法。委托调用表视图控制器类中的刷新方法 查看详情
调用实例方法“tableView”没有完全匹配
】调用实例方法“tableView”没有完全匹配【英文标题】:Noexactmatchesincalltoinstancemethod\'tableView【发布时间】:2020-07-0516:18:58【问题描述】:我只是想测试一个表格视图单元格选择。我尝试过使用tableView.selectRow(at:,animated:,scrollPositi... 查看详情
使用 NSFetchedResultsController 委托方法将多行插入 tableView 时的问题
】使用NSFetchedResultsController委托方法将多行插入tableView时的问题【英文标题】:IssueswheninsertingmultiplerowsintoatableViewusingNSFetchedResultsControllerdelegatemethods【发布时间】:2017-01-2605:22:00【问题描述】:因此,我将NSFetchedResultsController用... 查看详情
尝试通过 Composer 将 Laravel/Nova 更新到最新版本时出现 INVALID CREDENTIALS 错误
】尝试通过Composer将Laravel/Nova更新到最新版本时出现INVALIDCREDENTIALS错误【英文标题】:INVALIDCREDENTIALSerrorwhentryingtoupdateLaravel/NovaviaComposertolatestrelease【发布时间】:2019-12-2604:31:59【问题描述】:我已经尝试了两天来更新Nova在将compo... 查看详情
尝试调用 tableView.reloadData 时出现 NSInvalidArgumentException?
】尝试调用tableView.reloadData时出现NSInvalidArgumentException?【英文标题】:NSInvalidArgumentExceptionwhentriedtocalltableView.reloadData?【发布时间】:2016-06-2803:47:21【问题描述】:我看到了所有重复的问题并尝试了所有解决方案。但我无法成功... 查看详情
在 tableView(_ tableView:, cellForRowAt indexPath:) 委托方法中使用调度组; “未使用 UITableViewCell 类型的表达式”
】在tableView(_tableView:,cellForRowAtindexPath:)委托方法中使用调度组;“未使用UITableViewCell类型的表达式”【英文标题】:UsingdispatchgroupintableView(_tableView:,cellForRowAtindexPath:)delegatemethod;"ExpressionoftypeUITableViewCellisunused&quo 查看详情
未调用 UITextField 的委托方法
...:2015-09-1702:46:53【问题描述】:我有一个带有UITextField的tableView单元格来输入文本。我正在使用以下代码填充tableView:-(UITableViewCell*)tableView:(UITableView*)tableViewcellForRow 查看详情