我有一个UItableView,由10个元素组成.我打开了仪器以捕获内存泄漏,当我滚动tableView时,它开始泄漏内存.在仪器中我试图找到哪个导致泄漏但无法弄清楚,它说"_NScontiguousstring"表示整个泄漏.
我找到了Objective-C的一些解决方案,他们在"CellForRowAt"函数中检查了单元格是否为nil.我不认为它对Swift有用,但我试过并且按预期它不起作用.
我的问题是什么会导致这种内存泄漏?
我测试的设备;
iPhone X on 11.3.1
iPhone 6 11.2.5控制器类;
class TableViewController: UITableViewController {
let teamModel = TeamModel(uid: "adsada", name: "First Team ", idea: "idea 1", slogan: "Slogan 1", university: "dasda", image: "info", isActive: true)
let teamModel2 = TeamModel(uid: "adsada", name: "Team 2", idea: "idea 2", slogan: "adasd", university: "dasda", image: "info", isActive: true)
let teamModel3 = TeamModel(uid: "adsada", name: "Team 3", idea: "idea 3", slogan: "adasd", university: "dasda", image: "info", isActive: true)
let teamModel4 = TeamModel(uid: "adsada", …Run Code Online (Sandbox Code Playgroud) 我有一个水平的UIStackView,里面有两个UILabel。第一个 UILabel 是多行(两行),另一个只有一行。它们都有默认的内容压缩和抵抗优先级。我的问题是,即使标签之间存在差距,第一个文本中的“最佳”词也会出现在第二行。我注意到第一个标签没有超过总宽度的一半。
我想要的是第二个标签应该始终显示自己,第一个标签应该自己调整剩余空间的大小。如果它不能适合一行它应该是两行。但是,如果第二个标签太短而第一个标签很长但它们都可以容纳,则第一个标签应超过宽度的一半。
PS我在这个场景中需要使用UIStackView,因为还有其他情况。我知道在 UIView 中放置两个标签可能会解决问题。
UIStackView:
- Distribution: Horizontal
- Alignment: Center
- Spacing: 0
UILabel:
- Number of line: 2
- Line break: Word wrap
UILabel:
- Number of line: 1
Run Code Online (Sandbox Code Playgroud)
查看层次结构:
预期结果:
或者
编辑:我计算第二个标签的宽度并给出宽度约束。我认为它解决了我的问题,我会测试一下。
//Give specific width to second label to make first one calculate right number of lines.
if let font = UIFont(name: "Metropolis-ExtraBold", size: 15) {
let fontAttributes = [NSAttributedString.Key.font: font]
let size = (secondLabelText …Run Code Online (Sandbox Code Playgroud) 我只想获取 CloudKit 音乐记录中的 Song_Name 字段。我正在尝试下面的代码,但它仍然获取音乐记录中的所有字段。我想我需要使用 publicDB.add(operation) 方法编译操作,但它不允许我像现在使用 publicDB.perform(query, in....) 那样声明“results”
let predicate = NSPredicate(value: true)
let query = CKQuery(recordType: "Musics", predicate: predicate)
let operation = CKQueryOperation(query: query)
operation.desiredKeys = ["Song_Name"]
publicDB.perform(query, inZoneWith: nil) { [unowned self] results, error in
guard error == nil else {
DispatchQueue.main.async {
self.delegate?.errorUpdating(error! as NSError)
print("Cloud Query Error - Refresh: \(error)")
}
return
}
self.items_music.removeAll(keepingCapacity: true)
for record in results! {
let music = Musics(record: record, database: self.publicDB)
self.items_music.append(music)
}
DispatchQueue.main.async {
self.delegate?.modelUpdated()
}
} …Run Code Online (Sandbox Code Playgroud) 我有一个由 5 个元素组成的 UIStackView。我希望居中的比其他的大(如下图所示)。
我如何创建 UIStackView()
stackView.axis = UILayoutConstraintAxis.horizontal
stackView.distribution = UIStackViewDistribution.fillEqually
stackView.alignment = UIStackViewAlignment.bottom
stackView.spacing = 0.0
stackView.addArrangedSubview(supportedServicesView)
stackView.addArrangedSubview(incidentView)
stackView.addArrangedSubview(contactUsView)
stackView.addArrangedSubview(moreView)
stackView.addArrangedSubview(moreView2)
stackView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(stackView)
stackView.anchor(nil, left: self.view.leftAnchor, bottom: self.view.bottomAnchor, right: self.view.rightAnchor, topConstant: 0, leftConstant: 0, bottomConstant: 90, rightConstant: 0, widthConstant: 0, heightConstant: 0)
Run Code Online (Sandbox Code Playgroud)
我如何创建我的自定义 UIViews 子视图位置;
override func updateConstraints() {
logoImage.anchor(self.topAnchor, left: self.leftAnchor, bottom: nil, right: self.rightAnchor, topConstant: 0, leftConstant: 0, bottomConstant: 0, rightConstant: 0, widthConstant: 0, heightConstant: 0)
label.anchor(self.logoImage.bottomAnchor, left: self.leftAnchor, bottom: nil, right: self.rightAnchor, topConstant: …Run Code Online (Sandbox Code Playgroud) 我正在 Jenkins 上获取存档和 IPA。我想在获得构建后将 dsym 上传到 Fabric。如您所知,xcodebuild在 xcarchive/dSYMs 文件夹中生成 dsym。
我如何获取存档:
/usr/bin/xcodebuild -quiet -workspace My_Project.xcworkspace -scheme My_Project_Test -sdk iphoneos -configuration Release archive -archivePath CONFIGURATION_BUILD_DIR=${WORKSPACE}/build/My_Project_Test.xcarchive
Run Code Online (Sandbox Code Playgroud)
我如何获得 IPA:
/usr/bin/xcodebuild -exportArchive -archivePath CONFIGURATION_BUILD_DIR=${WORKSPACE}/build/My_Project_Test.xcarchive -exportOptionsPlist My_Project/Resources/Test/Test_ExportOptions.plist -exportPath CONFIGURATION_BUILD_DIR=${WORKSPACE}/build
Run Code Online (Sandbox Code Playgroud)
获取 dsym 的示例代码(目前不起作用):
ditto -c -k --keepParent -rsrc "${WORKSPACE}/build/My_Project_Test.app.dSYM" ${WORKSPACE}/build/My_project_Test-${PRODUCT_VERSION}-${PRODUCT_VERSION}-dSYM.zip
Run Code Online (Sandbox Code Playgroud)
上传代码:
$WORKSPACE/Pods/Fabric/upload-symbols -a xxxxxxxxxxxx -p ios -- build/My_Project_Test.app.dSYM
Run Code Online (Sandbox Code Playgroud)
我的问题是如何使用同上代码或一些相同的代码从 xcarchive 导出 dsym 文件。
我有一个 JSON,它由一个顶级对象组成,然后是一个由不同 JSON 对象组成的数组。我想用最少的结构和没有可选变量来解码这个 json。如果我可以实现,我还想设计一个结构,通过只编写其相关结构来处理所有数组对象。
我会尽量简化这个例子
正如您在图像中看到的,“Id”、“Token”、“ServicePublicKey”都是不同的 JSON 对象。我的整个后端都以这种 JSON 架构返回。我想要实现的是一个结构作为包装器和结构(Id、ServicePublicKey、Token 等)。最后,当有来自 JSON 的新类型时,我只需要编写相关的结构并在包装器中添加一些代码。
我的问题是:如何在没有任何可选变量的情况下解析这个 JSON?
我如何尝试解析它:
struct Initialization: Decodable {
var error: BunqError? //TODO: Change this type to a right one
var id: Int?
var publicKey: String?
var token: Token?
enum CodingKeys: String, CodingKey {
case error = "Error"
case data = "Response"
case Id = "Id"
case id = "id"
case ServerPublicKey = "ServerPublicKey"
case Token = "Token"
}
init(from decoder: Decoder) throws {
let …Run Code Online (Sandbox Code Playgroud) 我正在向javascript函数发送值并获得结果。但是,在以下代码中运行时,出现“错误域= WKErrorDomain代码= 5“ JavaScript执行返回了不支持的类型的结果” UserInfo = {NSLocalizedDescription = JavaScript执行返回了不支持的类型的结果}”错误;
webView?.evaluateJavaScript("getURL()") { (result, error) in
if let error = error
{
print("\(error)");
return
}
if let song = result as? String
{
print("\(song)");
}
}
Run Code Online (Sandbox Code Playgroud)
和javascript代码如下;
function getURL(){
CloudKit.configure({
containers: [{
// To use your own container, replace containerIdentifier and apiToken
containerIdentifier: 'iCloud.com.hello.myapp',
apiToken: 'myApiKey',
environment: 'development'
}]
});
console.log("cloudkitloaded");
var self = this;
console.log("get default container");
var container = CloudKit.getDefaultContainer();
console.log("set publicDB");
var publicDB = container.publicCloudDatabase;
self.items = ko.observableArray();
// …Run Code Online (Sandbox Code Playgroud) 我正试图通过仪器工具中的Leak Profiler来捕获内存泄漏并保留周期.但是,每当我单击Instruments中的记录按钮时,应用程序看起来就像启动然后崩溃一样.如果我从Xcode打开应用程序并将其转移到Instruments,我点击任何一个后应用程序崩溃UIButton.如果我从模拟器打开应用程序,我可以获得第二个屏幕,但随后它也会崩溃.此外,App不会在内存图中显示任何泄漏,也不会在正常使用时崩溃.
这是崩溃日志;
Exception Type: EXC_BAD_ACCESS (SIGSEGV) Exception Subtype: KERN_INVALID_ADDRESS at 0x0000000000000018 VM Region Info: 0x18 is not in any region. Bytes before following region: 4377985000 REGION TYPE START - END [ VSIZE] PRT/MAX SHRMOD REGION DETAIL UNUSED SPACE AT START --->
__TEXT 0000000104f2c000-0000000104fbc000 [ 576K] r-x/r-x SM=COW ...ti App Test]Termination Signal: Segmentation fault: 11 Termination Reason: Namespace SIGNAL, Code 0xb Terminating Process: exc handler [0] Triggered by Thread: 0
Filtered syslog: None found
Thread 0 name: …
我有一个卡片视图,看起来像下面的gif。我想UIView)在用户刷卡时淡出第一张卡并淡入第二张卡。UIView可以左右互换。我仅在以下帖子中找到有关此问题的信息,但不能帮助我。
/// This method handles the swiping gesture on each card.
@objc func handleCardPan(sender: UIPanGestureRecognizer) {
// if we're in the process of hiding a card, don't let the user interace with the cards yet
if cardIsHiding { return }
// change this to your discretion - it represents how far the user must pan up or down to change the option
// distance user must pan right or left to trigger an option
let …Run Code Online (Sandbox Code Playgroud) 我有一个可扩展的UITableView. 当部分被点击时,它们会随着动画(滚动)展开或折叠。我的问题是在展开或折叠标题时有一个奇怪的动画。UITableView滚动到顶部,然后转到点击的单元格。此外,当没有扩展单元格时,有时,它不会滚动到顶部,并且顶部标题和顶部视图之间有很大的空间UITableView。
我的问题是我需要滚动到扩展部分并摆脱滚动到顶部的错误。
我尝试了以下解决方案,但对我不起作用: insertRows 后防止表视图滚动到顶部
它看起来也与下面的问题相同,但无法弄清楚如何实现它。 为什么我的 UITableView 在插入或删除行时“跳跃”?
我如何切换选择:
func toggleSection(header: DistrictTableViewHeader, section: Int) {
print("Trying to expand and close section...")
// Close the section first by deleting the rows
var indexPaths = [IndexPath]()
for row in self.cities[section].districts.indices {
print(0, row)
let indexPath = IndexPath(row: row, section: section)
indexPaths.append(indexPath)
}
let isExpanded = self.cities[section].isExpanded
if(isExpanded){
AnalyticsManager.instance.logPageEvent(screenName: analyticsName!, category: "Button", action: Actions.interaction, label: "\(self.cities[section].name) Collapse Click")
}else{
AnalyticsManager.instance.logPageEvent(screenName: analyticsName!, category: "Button", action: Actions.interaction, …Run Code Online (Sandbox Code Playgroud) ios ×10
swift ×10
uistackview ×2
uitableview ×2
cloudkit ×1
codable ×1
crash ×1
ditto ×1
field ×1
instruments ×1
javascript ×1
jenkins ×1
json ×1
memory-leaks ×1
terminal ×1
uilabel ×1
wkwebview ×1