尝试通过委托方法更新 tableview 时出现弱和委托失败警告

     2023-02-23     139

关键词:

【中文标题】尝试通过委托方法更新 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 查看详情