我在使用故事板创建的ViewController中有一个UILabel.标签文本的字体,大小和颜色,它的对齐方式 - 都在故事板中设置.故事板中的标签连接到我的文件中名为p_patientNameLbl的插座.
现在我试图以编程方式更改标签的文本,如下所示:
[self.p_patientNameLbl setText:@"Vasya"];
Run Code Online (Sandbox Code Playgroud)
我没看到新文本,直到我意识到故事板中的原始标签在黑色背景上是白色的,但显然在我更改了上面的标签文本之后,所有字体属性都已重置,现在它是一个黑色文本黑色背景,因此没见过.一旦我以编程方式设置颜色:
[self.p_patientNameLbl setTextColor:[UIColor whiteColor]];
Run Code Online (Sandbox Code Playgroud)
我可以看到新标签,但所有其余的字体属性和对齐仍然是错误的.
有没有办法只更改标签的文本,而无需以编程方式设置所有其余的属性?我想有必须有办法,因为我不想在代码中格式化我的界面!
(更新)这是一个问题简而言之:在iOS中我想读取一个大文件,对它进行一些处理(在这种特殊情况下编码为Base64 string()并保存到设备上的临时文件.我设置一个NSInputStream从文件读取,然后在
(void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode
Run Code Online (Sandbox Code Playgroud)
我正在完成大部分工作.出于某种原因,有时我可以看到NSInputStream停止工作.我知道因为我有一条线
NSLog(@"stream %@ got event %x", stream, (unsigned)eventCode);
Run Code Online (Sandbox Code Playgroud)
在开始时(void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode,有时我会看到输出
stream <__NSCFInputStream: 0x1f020b00> got event 2
Run Code Online (Sandbox Code Playgroud)
(对应于事件NSStreamEventHasBytesAvailable)然后没有任何事情.不是事件10,它对应于NSStreamEventEndEncountered,不是错误事件,什么都没有!而且有时甚至我得到一个EXC_BAD_ACCESS异常,我现在不知道如何调试.任何帮助,将不胜感激.
这是实施.当我点击"提交"按钮时,一切都会开始,这会触发:
- (IBAction)submit:(id)sender {
[p_spinner startAnimating];
[self performSelector: @selector(sendData)
withObject: nil
afterDelay: 0];
}
Run Code Online (Sandbox Code Playgroud)
这是sendData:
-(void)sendData{
...
_tempFilePath = ... ;
[[NSFileManager defaultManager] createFileAtPath:_tempFilePath contents:nil attributes:nil];
[self setUpStreamsForInputFile: [self.p_mediaURL path] outputFile:_tempFilePath];
[p_spinner stopAnimating];
//Pop back to previous VC
[self.navigationController popViewControllerAnimated:NO] ;
}
Run Code Online (Sandbox Code Playgroud)
这是上面调用的setUpStreamsForInputFile:
- (void)setUpStreamsForInputFile:(NSString *)inpath outputFile:(NSString *)outpath {
self.p_iStream = [[NSInputStream alloc] initWithFileAtPath:inpath]; …Run Code Online (Sandbox Code Playgroud) 我想在NSInputStream中添加三个"部分":NSString,另一个流的输出,然后是另一个NSString.这个想法如下:
第一个和最后一个NSStrings表示SOAP请求的开始和结束,而流的输出是加载非常大的文件并将其编码为Base64字符串的结果.所以,最后我会让最终的NSInputStream像这样保存整个SOAP请求:
<soap beginning> <Base64编码数据> <soap结束>
我希望整个请求保存在NSInputStream中的原因有两个:
我认为这是强制在HTTP 1.1块中发送最终请求的唯一方法(我需要它,否则,如果请求变得太大,服务器将不接受它).所以,我知道这样做:
NSInputStream *dataStream = ....;
[request setHTTPBodyStream:dataStream];
Run Code Online (Sandbox Code Playgroud)确保请求将作为HTTP 1.1块发送,而不是作为一个巨大的原始SOAP请求发送.
所以,我想知道如何实现这一点 - 即,我如何将事物"排入"NSInputStream?甚至可以做到吗?还有另一种方法吗?
仅供参考,在Java中可以如下完成
Vector<InputStream> streamVec = new Vector<InputStream>();
BufferedInputStream fStream = new BufferedInputStream(fileData.getInputStream());
Base64InputStream b64stream = new Base64InputStream(fStream, true);
String[] SOAPBody = GenerateSOAPBody(fileInfo).split("CUT_HERE");
streamVec.add(new ByteArrayInputStream(SOAPBody[0].getBytes()));
streamVec.add(b64stream);
streamVec.add(new ByteArrayInputStream(SOAPBody[1].getBytes()));
SequenceInputStream seqStream = new SequenceInputStream(streamVec.elements());
Run Code Online (Sandbox Code Playgroud)
因为Java有这些对象可用,但Objective-c中的NSStreams看起来像非常低级别的对象,并且很难使用.
注意:我完全重写了原始问题,因为我在2天前问过它,因为我认为新编辑更清楚地解释了问题所在.我希望这将有助于它更容易理解,也许可以回答
以下是我迄今为止所能实现的目标:我使用临时文件首先编写<soap beginning>,然后设置输入流来从文件中读取,而不是尝试排入流中.块,将每个块编码为Base64字符串并将其写入相同的临时文件,最后,当我的流关闭时,我将<soap ending>写入临时文件.然后我设置另一个输入流与该文件的内容,我传递给NSMutableURLRequest:
NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:url];
...
NSInputStream *dataStream = [NSInputStream inputStreamWithFileAtPath:_tempFilePath];
[request setHTTPBodyStream:dataStream];
Run Code Online (Sandbox Code Playgroud)
这确保了HTTP 1.1分块传输文件的内容.连接完成后,删除临时文件.
这似乎工作正常,但当然这是一个烦人的工作.我不想写一个临时文件,当它可以由流处理(理想情况下).如果有人仍有更好的建议,请告诉我:)
好的,另一个更新是有序的.虽然我的文件写入似乎有效,但我现在遇到了一些意外问题,我的一些请求无法上传到服务器.具体来说,一切都按照计划进行,我正在将临时文件的内容读入流中,并将我的请求的HTTP主体设置为此流,并开始按我的意愿传输HTTP 1.1块 - 但对于某些一些数据包丢失的原因和最后的请求 - …
我有以下问题:我正在创建一个非常大的SOAP请求(数据是一个编码为Base64字符串的视频),因此我不能将其作为原始SOAP请求发送,而是需要在HTTP 1.1块中发送它.我似乎无法弄明白该怎么做.我在这里使用了代码: 对于分块传输编码,NSURLConnection的替代方法是什么, 但它似乎没有做我认为应该做的事情 - 我可以看到请求作为单个请求而不是许多块到达服务器上(我在服务器上使用WireShark来查看传入的流量.)
我知道Android上的类似功能使用Apache Foundations HTTP库进行Java工作 - 有了这些,任何预先未指定长度的HTTP请求都会作为HTTP 1.1 Chunked Request传输 - 我可以看到这些请求到达了服务器作为单独的块...我想模仿它.
(更新:似乎我AFNetworking可能有功能,但我没有找到任何关于如何使用它的例子.)
这是我的代码,或多或少:
NSString *soapBody = ....; //some correctly formed SOAP request XML here
NSURL *url = [NSURL URLWithString:...];
NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:url];
[request addValue: ... forHTTPHeaderField:@"SOAPAction"];
[request setHTTPMethod:@"POST"];
[request addValue:@"text/xml" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:[soapBody dataUsingEncoding:NSUTF8StringEncoding]];
ChunkedTransferConnection* connection = [ChunkedTransferConnection alloc];
[connection establishConnectionWithRequest:request];
Run Code Online (Sandbox Code Playgroud)
ChunkedTransferConnection的实现如下
@implementation ChunkedTransferConnection
@synthesize p_connection;
@synthesize p_responseData;
- (void)establishConnectionWithRequest:(NSMutableURLRequest *)request
{
self.p_responseData = [[NSMutableData alloc] initWithLength:0] ;
self.p_connection = [[NSURLConnection …Run Code Online (Sandbox Code Playgroud)