菜鸟教程小白 发表于 2022-12-12 22:28:09

iphone - 写入 plist 字典中的字符串


                                            <p><p>我使用的 plist 结构如下:plist, array, dict key string key string/dict, dict key string key string/dict,/array,/plist.</p>

<p>我想要使用以下代码<em>将当前字典中的“完成”字符串的值设置为"is"。</em></p>

<p>但是现在,代码<em>用当前字典的字符串替换了整个字典数组</em>(不过,“完成”键的值应该是"is"。)</p>

<p>什么是我想要的正确代码?</p>

<p>在 DetailViewController.m 中:</p>

<pre><code>-(IBAction)favoriteButtonPressed:(id)sender
{

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = ;
NSString *path = ;


[ setValue:@&#34;Yes&#34; forKey:@&#34;Done&#34;];
[ writeToFile:path atomically:YES];
}
</code></pre>

<p>detailsDataSource 和 detailIndex 是从 TableViewController.m segue 收到的。</p>

<p>TableViewController.m segue 部分:</p>

<pre><code>    detailViewController.detailsDataSource = [initWithArray:objectsArray];
    detailViewController.detailIndex = selectedRowIndex.row;
</code></pre>

<p>DetailViewController viewDidLoad</p>

<pre><code>if ([[ valueForKey:@&#34;Favorite&#34;] isEqual:@&#34;Yes&#34;]){

    forState:UIControlStateSelected | UIControlStateHighlighted];
}


districtLabel.text = [ valueForKey:@&#34;District&#34;];
</code></pre>

<p>detailsDataSource 数组在 detailViewController 中像这样使用,所以我不能从数组更改为字典,在这种情况下必须制作一个可变副本。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p><code>setValue:forKey</code> 不用于修改可变字典。您应该使用 <code>setObject:forKey</code>。即,这个:</p>

<pre><code>[ setValue:@&#34;Yes&#34; forKey:@&#34;Done&#34;];
</code></pre>

<p>应该是:</p>

<pre><code>[ setObject:@&#34;Yes&#34; forKey:@&#34;Done&#34;];
</code></pre>

<p>如果这不能解决问题,请确保字典和数组都是可变的:</p>

<pre><code>-(IBAction)favoriteButtonPressed:(id)sender {

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = ;
    NSString *path = ;

    NSMutableDictionary *mutDict = ];
    ;

    NSMutableArray *tmpMutArr = ;
    ];// make dict immutable before replacing.Casting it ( (NSDictionary *)mutDict ) works too.

    , detailsDataSource = nil;
    detailsDataSource = [ initWithArray:tmpMutArr];

    ;
}
</code></pre>

<hr/>

<p>另外,您可以使用 <code></code> 代替 <code>@"Yes"</code>:<br/>
<code> forKey:@"Done"];</code><br/>
通常会比使用 <code>@"Yes"</code> 更好。</p>

<p>还有:</p>

<pre><code>districtLabel.text = [ valueForKey:@&#34;Yes&#34;];
</code></pre>

<p>应该是:</p>

<pre><code>districtLabel.text = [ objectForKey:@&#34;Yes&#34;];
</code></pre>

<hr/>

<p>还注意到您<em>可能</em>存在内存泄漏:</p>

<pre><code>detailViewController.detailsDataSource = [ initWithArray:objectsArray];
</code></pre>

<p>确保在使用保留的属性 setter 时自动释放。</p></p>
                                   
                                                <p style="font-size: 20px;">关于iphone - 写入 plist 字典中的字符串,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/11923593/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/11923593/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: iphone - 写入 plist 字典中的字符串